将字符串对拼接后包含“string”中所有字符的字符串对


简介

一系列字符流一起构成,包含字母数字字符以及特殊符号,可以称为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的总和;

更新于:2023年7月31日

49 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告