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

更新於: 2020-12-03

143 次檢視

開啟你的 職業生涯

完成課程獲得認證

開始學習
廣告

© . All rights reserved.