leecode算法不含 AAA 或 BBB 的字符串详解有注释,简单明了。

5 篇文章 0 订阅

leecode算法不含 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”

提示:

0 <= A <= 100
0 <= B <= 100
对于给定的 A 和 B,保证存在满足要求的 S。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/string-without-aaa-or-bbb
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

做这个题首先需要读懂题

1 首先这个题说了
子串 ‘aaa’ 没有出现在 S 中;
子串 ‘bbb’ 没有出现在 S 中。
这个条件的意思就是 abaaaaa这个也是错误的解法;因为有存在子串aaa
2对于给定的 A 和 B,保证存在满足要求的 S。
这句话的意思就是说
已经保证了可以构造出来,所以不会出现A>>B(A远远大于B)或者B>>A(B远远大于A)导致不能构造。

这个题解法需要用到贪心算法

贪心算法我只做简单讲解,实在不懂得可以去B站上看看视屏或者 看其他的文章
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

贪心算法解释本题

贪心算法思路:
A和B谁最大时 就先填写谁,除非当接连写了两个A或者两个B时才会去写另外一个字母
这就是从当当前来考虑,不从整体来考虑

贪心算法(直接上算法,注释写的多,但是通俗易懂)

// An highlighted block
 public static void add(int a, int b) {
        // 先创建一个StringBuilder,用来添加所有的字符。
        StringBuilder stringBuilder = new StringBuilder();
        // 创建一个变量判断是否添加的是A
        boolean isWriteA;
        // 当a或者b有一个大于0时才会进入循环
        while (a > 0 || b > 0) {
            // 初始值为不添加A
            isWriteA = false;
            // 求出字符串的长度
            int length = stringBuilder.length();
            // 判断字符串是否>=2,并且取出倒数第一个和倒数第二个字母进行判断是否相等
            if (length >= 2 && stringBuilder.charAt(length - 1) == stringBuilder.charAt(length - 2)) {
                // 如果倒数第一个字符等于b,下一步就该添加A
                if (stringBuilder.charAt(length - 1) == 'b') {
                    isWriteA = true;
                }
            } else {
                // 如果a>=b就添加a
                if (a >= b) {
                    isWriteA = true;
                }
            }
            if (isWriteA) {
                a--;
                stringBuilder.append("a");
            } else {
                b--;
                stringBuilder.append("b");
            }
        }
        System.out.println(stringBuilder.toString());
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值