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());
}