题目出处:https://leetcode.com/problems/string-without-aaa-or-bbb/
题目描述:
给定两个整数A和B,返回任意字符串S,其中:
S的长度为A + B,并且恰好包含A ' A '个字母,以及B ' B '个字母;
子字符串“aaa”不出现在S中;子字符串“bbb”不出现在S中。
Example 1:
Input: A = 1, B = 2
Output: "abb"
Explanation: "abb", "bab" and "bba" are all correct answers.
Example 2:
Input: A = 4, B = 1
Output: "aabaa"
思路:
题意:构造一个字符串,由字符a和b组成,字符a的个数等于赋值于A的数,同样于 b,字符串的长度为二者之和。
唯一的要求就是不含有3连相同字母,我觉得可以用正则,Example1看出,因为不是构造一个合理的就行,所以在函数末尾写一个判断,来对构造后的字符串进行检测是否满足不3连重复即可。
var strWithout3a3b = function (A, B) {
let len = A + B,a='a',b='b';
let resultArr = [];
let result = '';
let xunhuan = true;
while (xunhuan){
//通过2个while构造数组,转成字符串的准备工作
while (A > 0 ) {
resultArr.splice(Math.floor(Math.random() * len), 0, a);
A--;
}
while (B>0){
resultArr.splice(Math.floor(Math.random() * len), 0, b);
B--;
}
//数组转成字符串
result = resultArr.join("");
console.log(result);
//对字符串进行正则判断
if(result.indexOf('aaa')===-1&&result.indexOf('bbb')===-1){
xunhuan = !xunhuan;
return result
}
}
}
事实证明,因为当A和B变大的时候,这个计算就会很大,因为我是随机组成的,一个地方不满足,整条构造序列都要重来,所以我之前的想法可能有问题,应该只构造出一个即使AB很大也能满足条件的字符串。
在solution里翻了一下,有一个新的思路,因为不能3连a或者3连b,所以实际上就是'ab'和'ba'的无序组合。
代码如下,注解已写:
var strWithout3a3b = function(A, B) {
let result = "";
//无论 "ab" 还是 "ba"拼接,是绝对安全的,下面用安全数对称呼
//通过A,B的大小选择拼接的方式
let set = (A >= B) ? "ab" : "ba";
//dif是A,B的差值,
//代表了安全数对用完后,剩下了dif个单个'a'或者单个'b'
let dif = Math.abs(A - B);
//min是代表了最后剩的到底是dif个'a'还是dif个'b'
let min = (A >= B) ? B : A;
//开始拼接,说不清,体会,与上面是一一对应的,目的是合理的插入字符串中
for (let i = 0; i < min; i++) {
if (dif > 0) {
result += (A >= B) ? 'a' : 'b';
dif--;
}
result += set;
}
if (dif > 0) {
for (let j = 0; j < dif; j++) {
result += (A >= B) ? 'a' : 'b';
}
}
return result;
};