JavaScript算法系列之-----------------字符串排列(JS實現)


1.輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的所有字符串abc,acb,bac,bca,cab和cba

字符串拼接

(先理解不輸入重復字符的)

 1 function permutate(str) {
 2     var result=[];
 3     if(str.length==1){
 4         return [str]    
 5     }else{  
 6         var preResult=permutate(str.slice(1));
 7         for (var j = 0; j < preResult.length; j++) {
 8             for (var k = 0; k < preResult[j].length+1; k++) {
 9                 var temp=preResult[j].slice(0,k)+str[0]+preResult[j].slice(k);   
10                 result.push(temp);              
11             }
12         }
13         return result;
14     }  
15 }
16 console.log(permutate("abc"));

 

上述方式不是用交換實現的 用的是字符串拼接的方法

 

原理:

固定第一個字符,遞歸取得第一個字符后面的各種字符串組合;

再把第一個字符與后面每一個字符交換,並同樣遞歸獲得收尾后面的字符串組合;

遞歸的出口為當只有一個字符的時候 

理解的不用看一下算法流程了!

=============================================================================================================

假設輸入abc 

大概走一遍算法執行流程

第一步 str='abc';

第二步 到6行 preResult='bc' 遞歸

第三步 到6行  preResult='c' 遞歸

第四步 到第四行返回 [c]  此時回到第三步的遞歸 str = 'bc' 執行第7行往下的循環 

            循環完畢后result=['bc','cb'] 此時返回第二步的遞歸 str='abc' 執行7行往下的循環

第五步 循環完畢后result=['abc','bac','bca','acb','cab','cba'] 此時輸出最終結果

 ============================================================================================================

 

字符串交換

 1 function permutation(str){
 2     let result = [];
 3     if(str.length === 1){
 4         return [str];
 5     }else{
 6         let last = permutation(str.slice(1));
 7         for(let i=0; i<last.length;i++){
 8             let ss = swap(str[0],last[i],result);
 9             result=ss;
10         }
11         return result;
12     }
13 }
14 function swap(a,b,result){
15     for(let i=0;i<b.length+1;i++){
16         let newStr = b;
17         let sss = newStr.split('');
18         sss.splice(i,0,a); 
19         result.push(sss.join(''))      
20     }
21     return result;
22 }
23 
24 let res = permutation('abc');
25 console.log(res);

 

 

對於有重復的字符串來說按照上述算法輸出出來會有重復的組合,偷懶的解法是直接去重就可以了

加一句Array.from(new Set(permutate("abc")));

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM