LeetCode 984.不含AAA或BBB的字符串(C++)
给定两个整数 A
和 B
,返回任意字符串 S
,要求满足:
S
的长度为A + B
,且正好包含A
个'a'
字母与B
个'b'
字母;- 子串
'aaa'
没有出现在S
中; - 子串
'bbb'
没有出现在S
中。
示例 1:
输入:A = 1, B = 2 输出:"abb" 解释:"abb", "bab" 和 "bba" 都是正确答案。
示例 2:
输入:A = 4, B = 1 输出:"aabaa"
提示:
0 <= A <= 100
0 <= B <= 100
- 对于给定的
A
和B
,保证存在满足要求的S
。
思路:直观感觉,我们应该先选择当前所剩最多的待写字母写入字符串中。举一个例子,如果 A = 6, B = 2
,那么我们期望写出 'aabaabaa'
。进一步说,设当前所剩最多的待写字母为 x
,只有前两个已经写下的字母都是 x
的时候,下一个写入字符串中的字母才不应该选择它。
class Solution { public: string strWithout3a3b(int A, int B) { string str = ""; char a = 'a', b = 'b'; if (A < B) { swap(a, b); swap(A, B); } //cout << "A:" << A << " " << a << " B:" << B << " " << b << endl; while (A > 0 || B > 0){ bool flag = false; if (A - B >= 3) { flag = true; } if (A - 2 >= 0) { str.push_back(a); str.push_back(a); A = A - 2; } else if (A == 1) { str.push_back(a); A--; } if (flag) { str.push_back(b); B--; } else if(B - 2 >= 0){ str.push_back(b); str.push_back(b); B = B - 2; } else if (B == 1) { str.push_back(b); B--; } } return str; } };
下面是大哥们的解法:
string strWithout3a3b(int A, int B) { //保证A > B string str = ""; char a = 'a', b = 'b'; if (A < B) { swap(A, B); swap(a, b); } while (A > 0 || B > 0) { if (A > 0) { str.push_back(a); A --; } if (A > B) { str.push_back(a); A --; } if (B > 0) { str.push_back(b); B --; } } return str; }