我们给了两个字符串str_1和str_2作为输入。目的是找到与str_2相同的字符串数,这些字符串可以使用从str_1挑选的字母构造,每个字母仅使用一次。
注–两者中的所有字母均相同。
让我们通过示例来理解。
输入-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]中,并将所有字母的频率存储在数组arr_2 [26]中。
取两个字符串str_1和str_2。计算长度为str_1.size()和str_2.size()。
函数count_string(字符串str_1,int len_str_1,字符串str_2,int len_str_2)同时获取字符串和长度,并返回可以从str_1构造的多个字符串str_2。
初始计数为INT_MAX。
用0初始化两个数组arr_1 [26],分别用于str_1中的字符频率和arr_2 [26],用于arr_2中的字符频率。
使用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
在所有循环结束时返回计数作为期望的结果。
#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