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

C++에서 AAA 또는 BBB가 없는 문자열

<시간/>

두 개의 정수 A와 B가 있다고 가정하고 모든 문자열 S를 반환해야 합니다. 다음과 같이 -

  • S는 A + B의 길이를 가지며 정확히 A의 문자 'a'와 B의 'b' 문자를 포함합니다.

  • 하위 문자열 "aaa" 및 "bbb"는 문자열 S

    에 없습니다.

따라서 주어진 정수가 A =4, B =1이면 결과는 "aabaa"가 됩니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 문자열 ret를 정의하십시오. 처음에는 비어 있습니다.

  • 동안 |A – B|>=2,

    • A> B이면

      • ret :=ret 'aa' 연결

      • A를 2만큼 감소

      • B가 0이 아닌 경우 'b'를 ret와 연결하고 B를 1만큼 감소

    • 기타

      • ret :=ret 'bb' 연결

      • B를 2만큼 감소

      • A가 0이 아닌 경우 'a'를 ret와 연결하고 A를 1만큼 감소

  • A가 0이 아니거나 B가 0이 아닌 동안

    • A가 0이 아니고 (ret의 크기 <2이거나 (ret의 크기>=2이고 ret의 마지막 요소 =ret의 두 번째 마지막 요소) ret의 마지막 요소가 'a'인 경우),

      • ret :=ret + 'a', A를 1 감소

      • B가 0이 아닌 경우

        • ret :=ret 'b' 연결, B를 1 감소

      • 그렇지 않으면 ret 'b'를 연결하고 B를 1만큼 줄입니다. A가 0이 아니면 a를 ret와 연결하고 A를 1만큼 줄입니다.

  • 리턴 렛

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

예시

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   string strWithout3a3b(int A, int B) {
      string ret = "";
      while(abs(A - B) >= 2){
         if(A > B){
            ret += 'a';
            ret += 'a';
            A -= 2;
            if(B) {
               ret += 'b';
               B--;
            }
         }else{
            ret += 'b';
            ret += 'b';
              B -= 2;
              if(A) {
               ret += 'a';
               A--;
            }
         }  
     }
      while(A || B){
         if(A && (ret.size() < 2 || !(ret.size() >= 2 && ret[ret.size() - 1] == ret[ret.size() -                2] && ret[ret.size() - 1] == 'a') ) ){
            ret += 'a';
            A--;
            if(B) {
               ret += 'b';
               B--;
            }
         }else{
            ret += 'b';
            B--;
            if(A) {
              ret += 'a';
              A--;
            }
         }      
      }
      return ret;
   }
};
main(){
   Solution ob;
   cout << (ob.strWithout3a3b(4, 1));
}

입력

4
1

출력

"aabaa"