C++中统计具有相同数量的0、1和2的子字符串


给定一个只包含0、1和2的字符串str。目标是找到str的所有子字符串,这些子字符串具有相同数量的0、1和2。如果str是“12012”,则具有相同数量的0、1和2的子字符串将是“120”、“201”和“012”。计数将为3。

让我们通过示例来理解。

输入 − str=”112200120”

输出 −具有相同数量的0、1和2的子字符串个数为− 5

说明 − 子字符串将是...

str[0-5]=”112200”, str[1-6]=”122001”, str[5-7]=”012”, str[6-8]=”120”, str[7-0]=”201”

输入 − str=”12012”

输出 −具有相同数量的0、1和2的子字符串个数为:3

说明 − 子字符串将是 −

str[0-2]=”120” , str[1-3]=”201”, str[2-4]=”012”

下面程序中使用的方法如下:

  • 获取一个整数类型的字符串并计算字符串的长度。

  • 将数据传递给函数进行进一步处理。

  • 使用一个名为count的临时变量来存储具有相同数量的0、1和2的子字符串的计数。

  • 创建一个map类型的变量,它将键值对映射到给定数字的频率。

  • 在键值对(0,0)处存储1,并从0到字符串长度开始循环。

  • 在循环内,检查IF str[i] = 0,则增加0的计数;ELSE IF str[i] = 1,则增加1的计数;ELSE增加2的计数。

  • 将0和1设置为0 - 1和0,将0和2设置为0 - 2。

  • 创建一对zero_one和zero_two,并将计数设置为count + map_pair的差值(通过创建键值对计算得出)。

  • 将map_pair加1。

  • 返回count。

  • 打印结果。

示例

 在线演示

#include <bits/stdc++.h>
using namespace std;
int count_string(string str_1, int length_str1, string str_2, int length_str2){
   int count = INT_MAX;
   int arr_1[26] = { 0 };
   int arr_2[26] = { 0 };
   for (int i = 0; i < length_str1; i++){
      arr_1[str_1[i] - 'a']++;
   }
   for (int i = 0; i < length_str2; i++){
      arr_2[str_2[i] - 'a']++;
   }
   int alphabets = 26;
   for (int i = 0; i < 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_str1 = str_1.size();
   int length_str2 = str_2.size();
   cout<<"Count occurrences of a string that can be constructed from another given string are: "<<count_string(str_1,length_str1, str_2, length_str2);
   return 0;
}

输出

如果我们运行以上代码,它将生成以下输出:

Count of Substrings with equal number of 0s, 1s and 2s are: 1

更新于:2020年12月1日

浏览量:299

开启你的职业生涯

完成课程获得认证

开始学习
广告