C++ 中不包含 AAA 或 BBB 的字符串


假设我们有两个整数 A 和 B,我们需要返回任何字符串 S,使得 -

  • S 的长度为 A + B,并且恰好包含 A 个字母 'a' 和 B 个字母 'b'。

  • 字符串 S 中不包含子字符串 “aaa” 和 “bbb”。

所以如果给定的整数是 A = 4,B = 1,则结果将是 “aabaa”。

为了解决这个问题,我们将遵循以下步骤 -

  • 定义一个字符串 ret,初始为空

  • 当 |A – B| >= 2 时,

    • 如果 A > B,则

      • ret := ret 连接 'aa'

      • 将 A 减 2

      • 如果 B 不为零,则将 'b' 连接到 ret 并将 B 减 1

    • 否则

      • ret := ret 连接 'bb'

      • 将 B 减 2

      • 如果 A 不为零,则将 'a' 连接到 ret 并将 A 减 1

  • 当 A 或 B 不为零时

    • 如果 A 不为零且(ret 的大小 < 2 或不满足(ret 的大小 >= 2 且 ret 的最后一个元素等于 ret 的倒数第二个元素)且 ret 的最后一个元素为 'a'),则

      • ret := ret + 'a',将 A 减 1

      • 如果 B 不为零

        • ret := ret 连接 'b',将 B 减 1

      • 否则 ret 连接 'b',将 B 减 1,如果 A 不为 0,则将 a 连接到 ret 并将 A 减 1

  • 返回 ret

让我们看一下以下实现,以便更好地理解 -

示例

 在线演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   string strWithout3a3b(int A, int B) {
      string ret = "";
      while(abs(A - B) >= 2){
         if(A > B){
            ret += 'a';
            ret += 'a';
            A -= 2;
            if(B) {
               ret += 'b';
               B--;
            }
         }else{
            ret += 'b';
            ret += 'b';
              B -= 2;
              if(A) {
               ret += 'a';
               A--;
            }
         }  
     }
      while(A || B){
         if(A && (ret.size() < 2 || !(ret.size() >= 2 && ret[ret.size() - 1] == ret[ret.size() -                2] && ret[ret.size() - 1] == 'a') ) ){
            ret += 'a';
            A--;
            if(B) {
               ret += 'b';
               B--;
            }
         }else{
            ret += 'b';
            B--;
            if(A) {
              ret += 'a';
              A--;
            }
         }      
      }
      return ret;
   }
};
main(){
   Solution ob;
   cout << (ob.strWithout3a3b(4, 1));
}

输入

4
1

输出

"aabaa"

更新于: 2020-04-30

232 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告