LeetCode 984.不含AAA或BBB的字符串(C++)

给定两个整数 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 = 6, B = 2,那么我们期望写出 'aabaabaa'。进一步说,设当前所剩最多的待写字母为 x,只有前两个已经写下的字母都是 x 的时候,下一个写入字符串中的字母才不应该选择它。

 

 

class Solution {
public:
    string strWithout3a3b(int A, int B) {
    string str = "";
    char a = 'a', b = 'b';
    if (A < B) {
        swap(a, b);
        swap(A, B);
    }
    //cout << "A:" << A << " " << a << "  B:" << B << " " << b << endl;

    while (A > 0 || B > 0){
        bool flag = false;
        if (A - B >= 3) {
            flag = true;
        }
        if (A - 2 >= 0) {
            str.push_back(a);
            str.push_back(a);
            A = A - 2;
        }
        else if (A == 1) {
            str.push_back(a);
            A--;
        }
        if (flag) {
            str.push_back(b);
            B--;
        }
        else if(B - 2 >= 0){
            str.push_back(b);
            str.push_back(b);
            B = B - 2;
        }
        else if (B == 1) {
            str.push_back(b);
            B--;
        }
    }
    return str;
}
};

 

下面是大哥们的解法:

string strWithout3a3b(int A, int B) {
    //保证A > B
    string str = "";
    char a = 'a', b = 'b';
    if (A < B) {
        swap(A, B);
        swap(a, b);
    }
    while (A > 0 || B > 0) {
        if (A > 0) {
            str.push_back(a);
            A --;
        }
        if (A > B) {
            str.push_back(a);
            A --;
        }
        if (B > 0) {
            str.push_back(b);
            B --;
        }
    }
    return str;
}

 

posted @ 2019-03-16 14:37  Hk_Mayfly  阅读(351)  评论(0编辑  收藏  举报