将字符串对拼接后包含“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的总和;
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP