Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

이진 문자열에 C++의 모든 곳에서 하나가 두 번 연속으로 나타나는지 확인하십시오.

<시간/>

여기서 우리는 또 다른 흥미로운 문제를 보게 될 것입니다. 다음 기준을 가진 문자열을 허용하는 코드를 작성해야 합니다.

  • 연속된 1의 모든 그룹은 길이가 2여야 합니다.
  • 연속된 1의 모든 그룹은 1개 이상의 0 뒤에 나타나야 합니다.

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) //when the string starts with 1, then return false
   return false;
   while (index <= n - 1) {
      if (str[index - 1] != '0') // If 1 doesn't appear after an 0
         return false;
      if (index + 1 < n && str[index + 1] != '1') // If '1' is not succeeded by another '1'
         return false;
      if (index + 2 < n && str[index + 2] == '1') // If sub-string is of the type "0111"
         return false;
      if (index == n - 1) // If str ends with a single 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