C++ 中字符串中“1(0+)1”模式出现的次数
给定一个包含 0、1 和其他字母的字符串 str。它还包含“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 且标志 check 为 1,则查看前一个值是否为 0。如果是,则递增计数,因为前一个 0 在两个 1 之间。对于任何非 0 或 1,再次将 check 设置为 0。
将输入字符串作为 str。
函数 Pattern_occurrences(string str, int length) 获取字符串及其长度,并返回字符串中“1(0+)1”模式出现的次数
将初始计数设置为 0。
将标志变量 check 最初设置为 0。
使用 for 循环遍历 str,从索引 i=0 到 i<length。
如果当前字符 str[i] 为 1 且 check 为 0,则将 check 设置为 1 并继续。
如果当前字符 str[i] 为 1 且 check 为 1。那么它是第二个 1。检查前一个值 str[i-1] 是否为 0。如果是,则找到模式。递增计数。
如果当前字符既不是 0 也不是 1,则它永远不会成为模式的一部分。将 check 设置为 0。现在遇到的下一个 1 将被视为下一个模式的开始(如果存在)。
最后,count 将包含 str 中此类模式的数量。
返回 count 作为结果。
示例
#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