用 C++ 统计可由另一个给定字符串构造的字符串的出现次数
我们得到两个输入字符串 str_1 和 str_2。目标是找到可以使用 str_1 中的字母构造的与 str_2 相同的字符串的计数,其中每个字符只使用一次。
注意 - 两个字符串中的所有字母都使用相同的大小写。
让我们通过例子来理解。
输入 - str_1 = "abcaaaabca",str_2 = "bca";
输出 - 可由另一个给定字符串构造的字符串的出现次数为:2
解释 - str_a 中的子串 bca -
str_1[1-3]=”bca” and str[7-9]=”bca”
输入 - str_1 = "about",str_2 = "cout";
输出 - 可由另一个给定字符串构造的字符串的出现次数为 - 0
解释 - str_a 中不存在子串 cout。
下面程序中使用的方案如下
我们首先计算 str_1 中所有字母的频率,并将其存储在数组 arr_1[26] 中,并将 str_2 中所有字母的频率存储在数组 arr_2[26] 中。
获取两个字符串 str_1 和 str_2。计算长度为 str_1.size() 和 str_2.size()。
函数 count_string(string str_1, int len_str_1, string str_2, int len_str_2) 获取两个字符串和长度,并返回可由 str_1 构造的 str_2 字符串的数量。
将初始计数设置为 INT_MAX。
初始化两个数组 arr_1[26] 用于存储 str_1 中字符的频率,arr_2[26] 用于存储 arr_2 中字符的频率,初始值为 0。
使用 for 循环遍历 str_1 和 str_2,并更新 arr_1 和 arr_2 中的频率。
现在再次使用 for 循环遍历 arr_2,如果当前频率 arr_2[i] 不为零,则计算 count(前一个值)和 arr_1[i]/arr_2[i] 的最小值(对于 str_2 的每个字符,只从 str_1 中取每个字母一次)。
最后,count 将具有 str_1 和 str_2 的匹配对应字符的最小值。例如 aaabbbb (a=3,b=4) 和 abb(a=1,b=2) 最小计数将为 1
在所有循环结束时返回 count 作为所需结果。
示例
#include <bits/stdc++.h> using namespace std; int count_string(string str_1, int length_str_1, string str_2, int length_str_2){ int count = INT_MAX; int arr_1[26] = { 0 }; int arr_2[26] = { 0 }; for (int i = 0; i < length_str_1; i++){ arr_1[str_1[i] - 'a']++; } for (int i = 0; i < length_str_2; i++){ arr_2[str_2[i] - 'a']++; } int total_alphabets = 26; for (int i = 0; i < total_alphabets; i++){ if(arr_2[i]){ count = min(count, arr_1[i] / arr_2[i]); } } return count; } int main(){ string str_1 = "knowledge", str_2 = "know"; int length_str_1 = str_1.size(); int length_str_2 = str_2.size(); cout<<"Count occurrences of a string that can be constructed from another given string are: "<<count_string(str_1,length_str_1, str_2, length_str_2); return 0; }
输出
如果我们运行上面的代码,它将生成以下输出:
Count occurrences of a string that can be constructed from another given string are: 1