###全排列
function permutate(str) {
var result=[];
if(str.length==1){
return [str]
}else{
var preResult=permutate(str.slice(1));
for (var j = 0; j < preResult.length; j++) {
for (var k = 0; k < preResult[j].length+1; k++) {
var newlist=preResult[j].slice(0,k)+str[0]+preResult[j].slice(k);
result.push(newlist);
}
}
return result;
}
}
function checkout(){
var str = document.getElementById("permutate").value;
var list = permutate(str);
console.log(list);
alert("查看具体结果请在console界面查看,输入的结果长度 : "+list.length);
}
全排列算法实现方法:
实现思路:递归法;把字符串分解成不再分状态,把不可再分状态作为结果返回,然后进行插入排序,层层结算,返回最终结果。
- 通过一个简单的例子来说明一下,比如字符abc,abc作为传入参数,由于其长度不为1,将其分解为a和bc,然后把bc递归,由于bc的长度依旧不是1;
- 将其分解为b和c然后将c继续作为参数成进行递归,由于此时已经将字符串分解为不可再分状态,所以将c作为最终结果返回到上一级的递归;
- 上一级的递归是把bc分解成b和c,所以这一级的在进行插入排序之后的返回结果是[“bc”,“cb”],这一级的结果继续返回上一层,上一层的递归是abc分成a和bc,
把a插入到返回结果中,结果变成[“abc”,“bac”,“bca”,“acb”,“cab”,“cba”].
function permutate(str) {
var result = []
if (str.length == 1) {
return [str]
} else {
var preResult = permutate(str.slice(1))
for (var j = 0; j < preResult.length; j++) {
for (var k = 0; k < preResult[j].length + 1; k++) {
var newlist =
preResult[j].slice(0, k) + str[0] + preResult[j].slice(k)
result.push(newlist)
}
}
return result
}
}
如果想去除由于输入字符串中存在字符相同相邻的而出现重复的子项,可以通过正则表达式:var regxe = /(.)\1+/g 来去除重复项。code:
var newResult = result.filter(function(string) {return !string.match(regex);});
全排列一行代码实现:
function permutations(string) {
return string.length == 1
? [string]
: string
.split('')
.map((e, i) =>
permutations(string.slice(0, i) + string.slice(i + 1)).map(
(e2) => e + e2
)
)
.reduce((r, e) => r.concat(e))
.sort()
.filter((e, i, a) => i == 0 || a[i - 1] != e)
}