두 개의 정수 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"