【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"

 

提示:

  1. 0 <= A <= 100
  2. 0 <= B <= 100
  3. 对于给定的 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写程序,题目不难,学好一门语言才难。

posted @ 2019-03-08 15:18  1000sakura  阅读(211)  评论(0编辑  收藏  举报