【LeetCode】String Without AAA or BBB(不含 AAA 或 BBB 的字符串)
这道题是LeetCode里的第984道题。
题目要求:
给定两个整数
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
。
首先思考临界条件,这里我们假设A>B,我们需要把字符A,B加入字符串中,那么什么时候会需要加入B字符呢?根据题目要求我们可以得出2(B+1)>=A,当A字符连续出现两次记为cntA=2,就一定要加入B字符;且添加B字符需要保证添加后2B>=A,因为根据题目,在任何时候都有2(B+1)>=A,这是一定的。当你加入一个B字符,就是需要满足2(B+1-1)>=A。
如果cntA=0,则一定要加入一个A字符,因为A字符数量多。
如果cntA=1,则可以根据情况是加入A或是B字符。
代码如下:
class Solution {
public String strWithout3a3b(int A, int B) {
StringBuilder sb = new StringBuilder();
char cha,chb;
if(A>B){
cha='a';chb='b';
}else{
cha='b';chb='a';
int temp=A;
A=B;B=temp; //A>B
}
int cntA=0;
int cntB=0;
while(A!=0||B!=0){
if(cntA==0){
sb=sb.append(cha);A--;cntA++;cntB=0;
}else if(cntA==1){
if(2*B>=A){
sb=sb.append(chb);B--;cntA=0;cntB++;
}else{
sb=sb.append(cha);A--;cntA++;cntB=0;
}
}else{
sb=sb.append(chb);B--;cntA=0;cntB++;
}
}
return sb.toString();
}
}
运行结果:
个人总结:
第一次用Java写程序,题目不难,学好一门语言才难。