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