นี่คือโจทย์ที่น่าสนใจ เราต้องเขียนโค้ดที่รับสตริงซึ่งต้องผ่านเกณฑ์ดังนี้
- ทุกกลุ่มของ 1 ที่ติดกัน ต้องมีความยาวเท่ากับ 2 เท่านั้น
- ทุกกลุ่มของ 1 ที่ติดกัน ต้องปรากฏหลัง 0 อย่างน้อย 1 ตัว
เช่น สตริง 0110 ถือว่าถูกต้อง แต่ 001110 และ 010 ไม่ถูกต้อง
วิธีแก้ไขคือ หาตำแหน่งของ 1 และตรวจสอบว่ามันเป็นส่วนหนึ่งของซับสตริง 011 หรือไม่ หากเงื่อนไขล้มเหลวที่ซับสตริงใด ให้คืนค่า false มิฉะนั้น true
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; bool isValidStr(string str) { int n = str.length(); int index = find(str.begin(), str.end(), '1') - str.begin(); if (index == 0) // ถ้าสตริงเริ่มด้วย 1 ให้คืนค่า false return false; while (index <= n - 1) { if (str[index - 1] != '0') // ถ้า 1 ไม่อยู่หลัง 0 return false; if (index + 1 < n && str[index + 1] != '1') // ถ้า 1 ไม่ได้ตามด้วย 1 อีกตัว return false; if (index + 2 < n && str[index + 2] == '1') // ถ้าซับสตริงเป็นแบบ "0111" return false; if (index == n - 1) // ถ้าสตริงจบด้วย 1 เดียว return false; index = find(str.begin() + index + 2, str.end(), '1') - str.begin(); } return true; } int main() { string str = "011000110110"; if(isValidStr(str)){ cout << str << " is a valid string"; } else { cout << str << " is NOT a valid string"; } }ผลลัพธ์
011000110110 is a valid string