不含 AAA 或 BBB 的字符串
难度:
标签:
题目描述
代码结果
运行时间: 25 ms, 内存: 16.0 MB
/*
* 思路:
* 1. 同样采用贪心算法,只不过使用Java Stream来生成最终的字符串。
* 2. 我们需要一个List来保存字符,利用循环向List中添加字符,最后用Stream连接起来。
*/
import java.util.*;
import java.util.stream.Collectors;
public class Solution {
public String strWithout3a3b(int a, int b) {
List<Character> list = new ArrayList<>();
while (a > 0 || b > 0) {
if (a > b) {
if (a > 1) { list.add('a'); list.add('a'); a -= 2; } else { list.add('a'); a--; }
if (b > 0) { list.add('b'); b--; }
} else if (b > a) {
if (b > 1) { list.add('b'); list.add('b'); b -= 2; } else { list.add('b'); b--; }
if (a > 0) { list.add('a'); a--; }
} else { // a == b
if (a > 0) { list.add('a'); a--; }
if (b > 0) { list.add('b'); b--; }
}
}
return list.stream().map(String::valueOf).collect(Collectors.joining());
}
}
解释
方法:
该题解采用的是贪心算法。首先,根据输入的两个整数a和b,分别代表字符'a'和'b'的数量。解题的核心思路是逐步构建结果字符串,同时确保字符串中不会出现连续三个相同的字符。在构建过程中,我们首先检查字符串末尾是否已经有连续两个相同的字符,若有,则添加另一种字符以打破可能的三连字符。若无连续字符,或者上述条件不满足,则优先添加数量较多的字符,以尽快消耗更多的字符。通过这种方式,我们保证了生成的字符串符合题目要求。
时间复杂度:
O(a + b)
空间复杂度:
O(a + b)
代码细节讲解
🦆
解题思路中提到,若字符串末尾已有连续两个相同的字符,会添加另一种字符来打破可能的三连字符。请问在特定情况下,若另一种字符的剩余数量为0,该如何处理?
▷🦆
贪心算法在此题中是如何确保在每次选择中都是最优的?即,添加字符的决策是否可能导致之后的选择中无法继续添加字符,从而违反题目要求?
▷🦆
您提到了在字符数量相等时优先添加'a',那么这种偏向是否有可能在特定的输入比如a和b相差很大时导致不理想的结果?
▷