C++ 串联后包含每个字符的字符串对

C++ 串联后包含每个字符的字符串对

介绍

将各种包含字母数字字符和特殊符号的字符流合并在一起,称为C++字符串。

字符串的串联是字符串数据结构中的重要方面,因为它用于将不同的子字符串或单词组合成完整的句子。在C++中,可以简单地使用+运算符进行串联。在本文中,我们将开发一段代码,它以字符串数组作为输入,然后分析每对字符串,以检查该对字符串是否包含单词”string”的所有字母。让我们看下面的示例以更好理解这个主题。

示例

示例1。

str ‚àí {"rtsr", "string", "gin","strin"}  
Output ‚àí 5

在下面的示例中,共有5对包含单词string的所有字母。

{rtsr , string} , {rtsr , gin } , {string , strin } , {string , gin } , {gin , strin }

在本文中,我们将开发一个代码来处理输入数组中以与单词”string”的字符对应的位掩码形式表示的对。由于单词”string”共有6个字符,所以组合的总数等于2^6-1,即63。

语法

str.length()

length()

每个C++字符串由固定数量的字母数字字符组成。在C++中,length()方法用于计算字符串中的字符数量。

sizeof(obj)

sizeof()

sizeof()方法用于返回调用该方法的对象分配的字节数。大小以字符变量大小的倍数返回,即1字节。

步骤

  • 接受一个字符串数组arr。

  • 使用length()方法计算字符串的长度,并将其存储在len变量中。

  • 字符串”string”的长度为6,因此可以生成0-63之间的布尔组合。

  • 将对应于数组arr的每个字符串存储为其位掩码。

  • MAX的值用于计算位掩码的总数。

  • 如果arr中访问的字符串中的字符包含在”string”中,则将其映射为1,否则为0。例如,”srng”映射为101011。

  • 计算每个字符串的位掩码后,分析每对字符串独立进行。

  • maski对应于第i个字符串的掩码,maskj对应于第j个字符串的掩码。如果两个字符串的位掩码组合为63(111111),则表示该对中的所有字母都出现在单词”string”中。

  • 如果i和j相等,计数增加(maski * maski – 1)/2。否则,计数增加(maski * maskj)。

  • 然后返回计数值。

示例

以下的C++代码片段用于输入一个字符串数组,然后计算包含单词”string”所有字符的全部配对数。

#include <bits/stdc++.h>
using namespace std;
#define MAX 64

// Function to return the bitmask for the string
int masking(string str) {
   int len = str.length();
   int temp = 0;
   for (int j = 0; j < len; j++) {
      char ch = str[j];
      //if character equals s
      if (ch == 's') {
         temp = temp | (1);
      }
      //if equals t
      else if (ch == 't') {
         temp = temp | (2);
      }
      //if equal r
      else if (ch == 'r') {
          temp = temp | (4);
      }
      //if equals i 
      else if (ch == 'i') {
          temp = temp | (8);
      }
      else if (ch == 'n') {
          temp = temp | (16);
      }
      else if (ch == 'g') {
         temp = temp | (32);
      }
   } 
   return temp;
}

// Function to return the count of pairs
int pairswithString(string arr[], int n) {
   int cnt = 0;
   // bitMask[i] will store the count of strings whose bitmask is i
   int bit[64] = { 0 };

   for (int i = 0; i < n; i++)
      bit[masking(arr[i])]+=1;

   //looping through the maskings obtained
   for (int i = 0; i < MAX; i++) {
      for (int j = i; j < MAX; j++) {
         // MAX - 1 = 63 
         if ((i | j) == (MAX - 1)) {
            int maski = bit[i];
            int maskj = bit[j];
            //any element cannot be a pair with itself
            if (i == j)
               cnt += ((maski * maski - 1) / 2);
            else
               cnt += ( maski * maskj );
         }
      }
   }
   return cnt;
}

int main() {
   string arr[] = { "rtsr", "string", "gin","strin" };
   cout<<"Input array ";
   for(string s : arr)
      cout<<s<<"\n";
   int len = sizeof(arr) / sizeof(arr[0]);
   int count = pairswithString(arr, len);
   cout<< "Total count of pairs : "<<count<<"\n";

   return 0;
}

输出

Input array rtsr
string
gin
strin
Total count of pairs ‚àí 5

结论

位掩码可以轻松用于操作和分析字符串。然后可以评估位掩码来查看它们的组合是否匹配,然后通过(n * n-1)/2来评估总和,直到达到数字n;

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程