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