欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

FCC算法:请不要重复

程序员文章站 2022-04-24 21:53:11
...

在fcc上遇到了一道题,费了好长时间才得出答案。特此记录一下。 

题目

把一个字符串中的所有的字符重新排列,然后生成一个新的字符串,返回的新字符串中没有连续重复的字符。连续重复是以单个字符为判断标准。

例如:aab应该返回 2, 因为它总共有 6 种排列方式: aab, aab, aba, aba, baa, baa,但是其中只有 2 个没有连续重复的字符(字符 a 是本例中的重复字符):abaaba

首先当然是先得出所有的排列组合,我的方法是先假定一个空数组,往其中逐个插入需要排列组合的元素。也就是每次排列都用后一个元素往前面的元素插入,得出所有的可能性,而所有的可能性再次重复之前的步骤。如下图:

FCC算法:请不要重复

这是我的答案: 

 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');

FCC算法:请不要重复