C++中包含字符X至少一次的子字符串计数


给定一个字符串str[]和一个字符X。目标是找到str[]的子字符串,使得所有子字符串都至少包含X一次。例如,对于str[]=”abc”和X=’a’,至少包含’a’一次的子字符串是“a”、“ab”、“abc”。计数为3。

让我们通过例子来理解。

输入 − str[] = “aabccd” X=’c’

输出 − 至少包含字符X一次的子字符串计数为− 14

解释 − 包含至少一个’c’的子字符串为:“c”、“cc”、“cd”、“bc”、“bcc”、“ccd”、“abc”、“abcc”、“bccd”、“aabc”、“aabcc”、“abccd”、“aabccd”。

输入 − str[] = “settings” X=’s’

输出 − 至少包含字符X一次的子字符串计数为− 14

解释 − 包含至少一个’s’的子字符串为:“s”, "se", "set", "sett", "setti", "setting", "settings", "gs", "ngs", "ngs", "sett", "tings", "setting", "ettings", "settings"

下面程序中使用的算法如下

在这个算法中,我们知道具有n个字符的字符串的子字符串总数为n*(n+1)/2。

我们现在将遍历字符串并计算字符X之前的字符数作为temp。一旦遇到X,包含X的字符串长度将为temp+1。现在我们有X个包含X的子字符串将是剩余字符(长度-当前索引)X(temp+1)。将此添加到计数中。现在将temp更新为0,并继续进行下一个X,直到字符串结束。最后,我们将计数作为至少包含字符X一次的子字符串的数量。

  • 取一个字符串str和一个字符x。

  • 函数sub_x(char str[],int length,char x)接受一个字符串、它的长度、字符x并返回至少包含字符x一次的子字符串的计数。

  • 将初始计数设置为0。将temp作为str[]中第一个x之前的字符数,初始设置为0。

  • 将初始计数设置为size*(size+1)/2,表示str[]所有可能的子字符串的数量。

  • 使用for循环遍历str[],从i=0到i<size。

  • 如果str[i]不是x,则将temp递增,表示第一个x之前的字符数。

  • 如果str[i] == x,则包含x的字符串长度将为temp+1。str[]的剩余字符将为length-i。

  • 所有子字符串将为(temp+1) * (length-i)。将此添加到计数中。现在将temp更新为0,用于下一次迭代。

  • 执行此操作直到到达str[]的末尾。

  • 最后返回计数作为结果。

示例

 在线演示

#include <bits/stdc++.h>
using namespace std;
int sub_x(string str, int length, char x){
   int count = 0;
   int temp = 0;
   for (int i = 0; i < length; i++){
      if (str[i] == x){
         int temp_2 = temp + 1;
         count = count + temp_2 * (length - i);
         temp = 0;
      }
      else{
         temp++;
      }
   }
   return count;
}
int main(){
   string str = "abcabbc";
   int length = str.length();
   char x = 'a';
   cout<<"Count of sub-strings that contain character X at least once are: "<<sub_x(str, length,
x);
   return 0;
}

输出

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

Count of sub-strings that contain character X at least once are: 19

更新于:2020年12月2日

250 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告