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;