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

探讨了一种避免出现连续三个相同字符的字符串构造算法,通过贪心策略在给定A个'a'与B个'b'的情况下,生成长度为A+B的字符串S,确保不包含'aaa'或'bbb'子串。示例展示了不同输入下的有效解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值