C ++中字符串中“ 1(0+)1”模式的出现次数

我们给了一个字符串str,其中包含0s,1s和其他字母。它还包含形式为“ 1(0+)1”的模式,其中0+表示连续0的任何数量(> 0)。目的是在字符串str中找到这样的模式(“ 1(0+)1”)。

让我们用例子来理解

输入− str =“ abb010bb10111011”

输出-字符串中“ 1(0+)1”模式的出现次数为-2

说明-str内部的模式突出显示:“ abb010bb10111011”,“ abb010bb10111011”

输入− str =“ 01001011001001100”

输出-字符串中“ 1(0+)1”模式的出现次数为-4

说明-str内部的模式突出显示:“ 01001011001001100”,“ 01001011001001100”,“ 01001011001001100”,“ 01001011001001100”

以下程序中使用的方法如下

可以看出,所有模式都以1开始和结束。我们将使用标志变量check = 1标记第一个1,并跳过所有0。

对于其他任何字符(既不是0也不是1),请将check设置为0。

如果找到另一个1,并且标志检查为1,则查看前一个值是否为0。如果是,则递增计数,因为前一个0在两个之间。对于任何非0或1,请再次检查为0。

  • 将输入字符串作为str。

  • 函数Pattern_occurrences(string str,int length)获取字符串及其长度,并返回字符串中“ 1(0+)1”模式的出现次数

  • 将初始计数设为0。

  • 最初将标志变量检查设为0。

  • 使用for循环从索引i = 0到i <length遍历str。

  • 如果当前字符str [i]为1且check为0,则将check设置为1并继续。

  • 如果当前字符str [i]为1,并且检查为1。则为第二个1。检查先前的值str [i-1]是否为0。如果是,则找到模式。增量计数。

  • 如果当前字符既不是0也不是1,则它将永远不会成为模式的一部分。将check设置为0。现在,下一个遇到的1将被视为下一个模式的开始(如果存在)。

  • 最后,在str内部会有许多这样的模式。

  • 返回计数作为结果。

示例

#include<iostream>
using namespace std;
int Pattern_occurrences(string str, int length){
   int count = 0;
   bool check = 0;
   for (int i = 0; i < length ; i++){
      if (str[i] == '1' && check == 1){
         if (str[i - 1] == '0'){
            count++;
         }
      }
      if (str[i] == '1' && check == 0){
         check = 1;
         continue;
      }
      if (str[i] != '0' && str[i] != '1'){
         check = 0;
      }
   }
   return count;
}
int main(){
   string str = "01010111011";
   int length = str.length();
   cout<<"Count of occurrences of a “1(0+)1” pattern in a string are: "<< Pattern_occurrences(str, length);
   return 0;
}

输出结果

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

Count of occurrences of a “1(0+)1” pattern in a string are: 3
猜你喜欢