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 <= 1000 <= 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; }

浙公网安备 33010602011771号