Leetcode 984:不含AAA或BBB的字符串

题目描述

给定两个帧数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;

猜你喜欢

转载自blog.csdn.net/weixin_35338624/article/details/87826597