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(stringstr,intlength)获取字符串及其长度,并返回字符串中“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