C++ 满足给定条件的字符串的计数
介绍
C++中的字符串也是一种原始数据类型,由字母数字字符组成。字符串中的字母区分大小写,但可以包含大写和小写字母。
在本文中,我们给出了一个由小写字符串组成的输入数组,并要求满足以下条件的字符串对的计数:
- 两个字符串应该有相同的第一个和最后一个元音字母。
-
两个字符串具有相等数量的配对。
数组是一种模拟存储类似元素的数据结构。 C++数组必须满足以下属性:
- 数组中的所有元素必须属于相同的数据类型。
-
数组与固定长度相关联。
这里有一个示例来了解所问问题,
示例
示例1 – arr:{"bitch","glitch","bitter","ditch"}
输出 – 1
解释 – 满足条件的字符串对是“bitch”和“glitch”,它们具有元音字母{i}。这些字符串的第一个和最后一个元音字母也是’i’,它们是等效的。字符串“ditch”也满足条件,但已经包含在有效对中。
解决此问题的方法是字符检查,然后在C++中使用元组来存储元音字母的计数。
语法
make_tuple ( val1, val2, val3..)
The make_tuple()函数在C++中用于构造元组中指定类型的对象。它用于在map中给元组赋值。这些值按照它们的声明顺序赋值。
参数
val1, val2 , .. – 要赋值给map中的元组的值。
在评估此方法时使用了另一种方法:
push_back( val1)
push_back()是C++中用于向数据对象(如向量或映射)插入元素的内置方法。插入总是从末尾进行。每次插入,对象的大小增加一。该方法的执行时间复杂度为常数。
参数
val – 要插入到C++对象中的值。
步骤
- 取一个样本字符串数组arr作为输入。
-
维护一个映射map,用于存储满足所需条件的单词元组。
-
使用for循环来对arr进行迭代,循环变量为i。
-
- 在每次迭代期间,存储一个字符向量vec,以跟踪从数组arr中提取的单词的元音。
-
使用word变量引用数组的特定单词。
-
对提取的数组word进行循环迭代,循环变量为j。每次从word中提取特定字符,并检查它是元音还是辅音。
-
如果提取的字符是元音,则将其推入vec。
-
如果vec非空,即存在元音,则从当前单词i中提取第一个和最后一个元音。
-
使用提取的元音和第i个单词中的元音总数构建映射中的元组,然后将其映射到第i个索引。使用push_back()方法将创建的元组添加到映射的末尾。
-
对映射进行迭代。
-
计算可能使用映射中的元组对形成的数对的数量。
-
将数对的数量作为输出返回,由变量count表示。
示例
下面的C++代码段说明了计数满足以下条件的字符串的过程:
//include the required libraries
#include <bits/stdc++.h>
using namespace std;
//count number of pairs satisfying the cond
int satisfycondn(string sarr[], int n){
//declaring map to store tuples
map<tuple<char, char, int>, vector<int> > map;
// For every string of the array
for (int i = 0; i < n; i++) {
//storing vowels of the extracted word
vector<char> vec;
//extracting the word
string word = sarr[i];
for (int j = 0; j < word.size(); j++) {
char ch = sarr[i][j];
//checking if the character is vowel
if (ch=='a' || ch=='e' || ch=='i' || ch=='o' || ch=='u')
vec.push_back(ch);
}
int numvowels = vec.size();
// If current string contains vowels
if (numvowels > 0) {
int frstvowel = vec[0];
int scndvowel = vec[numvowels - 1];
map[make_tuple(frstvowel, scndvowel, numvowels)]
.push_back(i);
}
}
//maintaining a count to store the pair of strings satisfying the cond
int count = 0;
//iterating over the map
for (auto m : map) {
vector<int> v = m.second;
//getting the valid pair of size
int v_size = v.size();
//incrementing the counter
count += v_size / 2;
}
return count;
}
int main() {
//declaring a sample array
string arr[] = { "point", "coin","groin","foul","area", "mourn" };
int n = sizeof(arr) / sizeof(string);
cout << "Count of strings satisfying the condition : "<<satisfycondn(arr,n);
return 0;
}
输出
Count of strings satisfying the condition − 2
解释-数组中有两对字符串满足条件-{point, coin}和{foul, mourn}
第一对字符串中的元音字母各有2个,分别是o和i。
第二对字符串中的元音字母各有2个,分别是o和u。
结论
C++中的映射是非常灵活的数据结构,用于以更友好的方式存储数据及其相关属性。它简化了根据指定条件访问数据的过程。