FCC算法:请不要重复
程序员文章站
2022-04-24 21:53:11
...
在fcc上遇到了一道题,费了好长时间才得出答案。特此记录一下。
题目
把一个字符串中的所有的字符重新排列,然后生成一个新的字符串,返回的新字符串中没有连续重复的字符。连续重复是以单个字符为判断标准。
例如:
aab
应该返回 2, 因为它总共有 6 种排列方式:aab
,aab
,aba
,aba
,baa
,baa
,但是其中只有 2 个没有连续重复的字符(字符 a 是本例中的重复字符):aba
,aba
首先当然是先得出所有的排列组合,我的方法是先假定一个空数组,往其中逐个插入需要排列组合的元素。也就是每次排列都用后一个元素往前面的元素插入,得出所有的可能性,而所有的可能性再次重复之前的步骤。如下图:
这是我的答案:
function repeat(str){
var temp=[]; /*暂存source值,对其进行更改而不影响source值。*/
var all=[];
/*逐个将str的元素插入source数据源,考虑到每个间隙的可能性。*/
function arrange(source,index){
for(let i=0;i<=source.length;i++){
temp=source.slice(0);
temp.splice(i,0,str[index]);//插入元素
all.push(temp);//保存每次插入元素后的值
}
}
/*进行外循环,控制待插入元素的下标*/
for(let j=0;j<str.length;j++){
/*将上一次得到的排列组合赋值给一个变量,避免之后初始化all而受到影响。*/
var source=all.slice(0);
/*给定初始值空数组*/
if(all.length==0){
arrange([],j);
}else{
all=[];/*初始化上次得到的结果,防止在之后的循环中重复排列。*/
/*如果得到的排列组合为多个,将每个数组元素都进行排列组合,直到插入第二个元素。进入下一个外循环*/
for(let i=0;i<source.length;i++){
arrange(source[i],j);
}
}
console.log("------------第"+(j+1)+"次插入排列");
console.log(all);
}
/*筛选最后得到的排列组合,将不是重复的组合保留下来,最后取长度值,正则表达式/(.)\1+/代表任意字符重复超过两个或以上*/
return all.filter((a)=>!/(.)\1+/.test(a.join(''))).length;
}
repeat('abcd');