สมมติสตริงมีรูปแบบแบบ 1(0+)1 โดยที่ (0+) บ่งบอกถึงการเกิดของ 1 ติดต่อกันไม่ว่าง เราต้องหารูปแบบทั้งหมด รูปแบบอาจทับซ้อนกันได้ สตริงไม่จำเป็นต้องเป็นสตริงไบนารี อาจมีตัวเลขและตัวอักษรพิมพ์เล็กเท่านั้น สมมติสตริงเป็น 1101001 จะมีรูปแบบ 2 แบบ คือ 101 และ 1001
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ −
- วนลูปผ่านทุกตัวอักษร c ในสตริง
- เมื่อ c เป็น 1 เราจะวนจนกว่าสมาชิกจะเป็น 0
- เมื่อสตรีมของ 0 จบ เราจะตรวจสอบว่าตัวอักษรถัดไปเป็น 1 หรือไม่
- ขั้นตอนเหล่านี้จะทำซ้ำจนถึงท้ายสตริง
ตัวอย่าง
#include <iostream>
using namespace std;
int countBinPattern(string main_str) {
char last_char = main_str[0];
int i = 1, counter = 0;
while (i < main_str.size()) {
if (main_str[i] == '0' && last_char == '1') {
while (main_str[i] == '0')
i++;
if (main_str[i] == '1')
counter++;
}
last_char = main_str[i];
i++;
}
return counter;
}
int main() {
string str = "10010110000101";
cout << "Number of substrings of pattern 1(0+)1 is: " << countBinPattern(str);
}
ผลลัพธ์
Number of substrings of pattern 1(0+)1 is: 4