0x01.问题
给定两个整数
A
和B
,返回任意字符串S
,要求满足:
1.S
的长度为A + B
,且正好包含A
个'a'
字母与B
个'b'
字母;
2.子串'aaa'
没有出现在S
中;
3.子串'bbb'
没有出现在S
中。
提示:0 <= A <= 100
0 <= B <= 100
对于给定的A
和B
,保证存在满足要求的S
。
C++函数形式为:string strWithout3a3b(int A, int B)
0x02.分析
题目保证一定存在这样的S
,我们可以逆向的分析一下,当两个整数需要满足什么样的情况时,才一定能保证存在这样的S
呢?
来一个极端的思想,如果A
非常多,B
非常少,A
和B
之间存不存在制约呢?
我们很容易得出这样的极端情况就是A=2B+2
,也就是每两个a
后都跟着一个b
,最后还有两个a
的情况。如果a
再多一个,就找不到合适的位置了。相反,如果b
多a
少,也是一样的情况。
于是我们就有思路了,假如a
多b
少,我们可以先按照b
的数量构造出一个极端情况的字符串,然后,再根据a
的数量从两个相邻的里面删去一个。反过来也是一样的做法。
还有就是A==B
的情况,这时候,只要一个接一个的加上去就行了。
整个题的思路:
- 先构造极端条件,再根据实际数量删去相应的重复字符。
- 先奏后斩,哈哈。
0x03.解决代码
class Solution {
public:
string strWithout3a3b(int A, int B) {
string s;
if(A==B){
s="";
for(int i=0;i<A+B;i++){
if(i%2==0) s+='a';
else s+='b';
}
return s;
}
if(A>B){
s="";
int a=0,b=0;
for(int i=0;i<3*B+2;i++){
if(a<2){
s+='a';
a++;
}
else{
s+='b';
b++;
a=0;
if(b>=B){
s+="aa";
break;
}
}
}
int num=2*B+2-A;
for(int i=0;i<num;i++){
s.erase(i*2,1);
}
return s;
}
else{
s="";
int b=0,a=0;
for(int i=0;i<3*A+2;i++){
if(b<2){
s+='b';
b++;
}
else{
s+='a';
a++;
b=0;
if(a>=A){
s+="bb";
break;
}
}
}
int num=2*A+2-B;
for(int i=0;i<num;i++){
s.erase(i*2,1);
}
return s;
}
return s;
}
};
ATFWUS --Writing By 2020–03–20