题目描述
给定两个帧数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"
解题思路:
刚刚拿到这道题,最开始想到的是使用递归解答。想的是先初始化字符串str为较长的字母构成,然后不断将较短字母插入。根据分治思想:在长为m的字符串b中插入n个a,在长为m+1(m个b加1个a)字符串中插入n-1个a......依此类推。递归式是for循环遍历i=0到str的长度个插入位置,递归边界是插入字母的个数为0;但是会超时,然后考虑剪枝操作优化。无奈陷于本人水平太差,没能想出有效的办法。只能换一种思路,一开始想到递归除了本题有很好的分治特征外,示例的解释也很有迷惑性,容易使我这样的初学者想到枚举所有可能情况在筛选的策略。本题正确的思路是使用贪心,先选两个较多的然后再选较少的字母。本题给我的启示就是,拿到一道题,根据不同的算法思想依此思考:排序、递归、贪心、二分、two pointers、动态规划
string strWithout3a3b(int A, int 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 += a;
A--;
}
if(A > B){
str += a;
A--;
}
if(B > 0){
str += b;
B--;
}
}
return str;