满足给定条件的字符串计数
简介
在 C++ 中,字符串也是一种基本数据类型,它由字母数字字符组成。字符串中的字母区分大小写,但字符串可以包含大写和小写字母。
在本文中,我们得到一个包含小写字符串的输入数组,需要计算数组中满足以下条件的字符串对的数量:
两个字符串都应该具有相同的首尾元音。
两个字符串都具有相同数量的元音对。
数组是一种模拟存储相似元素的数据结构。C++ 数组必须满足以下属性:
数组中的所有元素都必须属于相同的数据类型。
数组具有固定长度。
以下是一个关于所提问题的示例:
示例
示例 1 - arr : { “bitch” , “glitch” , “bitter”, “ditch”}
输出 - 1
解释 - 满足条件的字符串对是“bitch”和“glitch”,它们都包含元音{i}。这两个字符串的首尾元音都是'i',是等价的。“ditch”也满足条件,但它已经被包含在一个有效的对中了。
解决这个问题的方法是字符检查,然后在C++中维护一个元组来存储元音的计数。
语法
make_tuple ( val1, val2, val3..)
C++中的`make_tuple()`函数用于构造指定类型的元组对象。它用于将值赋给映射中的元组。值按声明顺序赋值。
参数
val1, val2 , .. - 要赋给映射中元组的值。
在评估此方法的过程中使用的另一种方法是:
push_back( val1)
内置的`push_back()`方法用于将元素插入C++数据对象,例如向量或映射。插入总是从末尾进行。每次插入后,对象的大小都会增加一。该方法在恒定时间复杂度内执行。
参数
val - 要插入到C++对象中的值。
算法
将一个示例字符串数组 arr 作为输入。
维护一个映射 map 来存储满足所需条件的单词元组。
使用 for 循环 i 对 arr 进行迭代。
- 在每次迭代中,存储一个字符向量 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++ 中的映射是相当通用的数据结构,用于以更友好的方式存储数据及其关联属性。它简化了根据指定条件访问数据。