用 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

更新于:2020年12月1日

160 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始
广告