0984-不含 AAA 或 BBB 的字符串

Raphael Liu Lv10

给定两个整数 ab ,返回 任意 字符串 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, b <= 100
  • 对于给定的 ab,保证存在满足要求的 s

​​​

方法:贪心

思路

直观感觉,我们应该先选择当前所剩最多的待写字母写入字符串中。举一个例子,如果 A = 6, B = 2,那么我们期望写出 'aabaabaa'。进一步说,设当前所剩最多的待写字母为 x,只有前两个已经写下的字母都是 x 的时候,下一个写入字符串中的字母才不应该选择它。

算法

我们定义 A, B:待写的 'a''b' 的数量。

设当前还需要写入字符串的 'a''b' 中较多的那一个为 x,如果我们已经连续写了两个 x 了,下一次我们应该写另一个字母。否则,我们应该继续写 x

[xe7TWkmP-Java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public String strWithout3a3b(int A, int B) {
StringBuilder ans = new StringBuilder();

while (A > 0 || B > 0) {
boolean writeA = false;
int L = ans.length();
if (L >= 2 && ans.charAt(L-1) == ans.charAt(L-2)) {
if (ans.charAt(L-1) == 'b')
writeA = true;
} else {
if (A >= B)
writeA = true;
}

if (writeA) {
A--;
ans.append('a');
} else {
B--;
ans.append('b');
}
}

return ans.toString();
}
}
[xe7TWkmP-Python]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution(object):
def strWithout3a3b(self, A, B):
ans = []

while A or B:
if len(ans) >= 2 and ans[-1] == ans[-2]:
writeA = ans[-1] == 'b'
else:
writeA = A >= B

if writeA:
A -= 1
ans.append('a')
else:
B -= 1
ans.append('b')

return "".join(ans)

复杂度分析

  • 时间复杂度:O(A+B)。

  • 空间复杂度:O(A+B)。

 Comments
On this page
0984-不含 AAA 或 BBB 的字符串