基本思路:
func digui=function(strlist){
如果strlist中只有两个元素,则返回数组[[strlist[0],strlist[1]],[strlist[1],strlist[0]],
否则
取出str中任意一个
剩下的继续调用digui函数
}
实际代码:
/*
* 输出字符串全排列
* 例如:
* 入参:abc
* 出参:abc acb bac bca cab cba
* */
function main() {
let ttt=getquanpailie("abcd");
console.log(ttt);
}
function getquanpailie(str) {
let strlist=[];
for(let i=0;i<str.length;i++){
strlist.push(str[i]);
}
let result=digui(strlist);
if(result.length<=0)return "";
else if(Object.prototype.toString.call(result[0]).indexOf("Array")>=0){
return result.map(item=>{
return item.join('');
})
}
else{
return result[0];
}
}
function digui(strlist) {
if(strlist.length<=0) return [];
else if(strlist.length<2) return [strlist[0]];
else if(strlist.length==2) return [[strlist[0],strlist[1]],[strlist[1],strlist[0]]];
else{
//大于2的情况
let result=[];
for(let i=0;i<strlist.length;i++){
let newchar=strlist[i];
let newstrlist=getnewstr(strlist,i);
let newsublist=digui(newstrlist);
for(let j=0;j<newsublist.length;j++){
newsublist[j].splice(0,0,newchar);
}
result=result.concat(newsublist);
}
return result;
}
}
function getnewstr(list,index) {
let result=[];
for(let i=0;i<list.length;i++){
if(i!=index){
result.push(list[i]);
}
}
return result;
}