计算可以从C ++中的另一个给定字符串构造的字符串的出现次数

我们给了两个字符串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