您的位置:首页 > Web前端 > JavaScript

javascript 字符串的排列与组合

2018-03-27 16:06 302 查看

不重复字符串的组合

输入输出
没有重复值的字符串所有可能的组合值
abca,b,c,ab,bc,abc

思路

递归的思想。一个字符串的所有组合值包含三种情况:

1. 仅包含首字母

2. 首字母+除首字母外的字符串组合值

3. 除首字母外的字符串组合值

实现

function getCombination(str){
if(str.length === 1){
return [str]
}

let arr1 = arguments.callee(str.slice(1));
let res1 = arr1.map(x => str[0]+x);
let res2 = arguments.callee(str.slice(1));
let res3 = [str[0]]
return res1.concat(res2,res3);
}

console.log(getCombination("abc"));
//["abc", "ac", "ab", "bc", "c", "b", "a"]


不重复字符串的排列

输入输出
不重复字符串所有可能的排列值
abcabc,acb,bac,bca,cab,cba

思路

递归。对于ab的排列值,先求出b的排列值,然后将a放置与b之前和b之后,得到ab的排列值。

对于abc的排列值,先求出bc的所有排列值,然后将a放置于后两个数的之前/之中/之后三个位置之一,得到abc的所有排列值。以此类推。

实现

function getPerputation(str){
if (str.length == 1) {
return [str];
}
let res = []
let arr = arguments.callee(str.slice(1));
for(let i = 0;i < arr.length;i++){
let partArr = [];
for(let j = 0;j < arr[i].length+1;j++){
let newStr = arr[i].slice(0,j) + str[0] + arr[i].slice(j);
partArr.push(newStr);
}
res = res.concat(partArr)
}
return res;
}

console.log(getPerputation("abc"));
//["abc", "bac", "bca", "acb", "cab", "cba"]


第二种思路

递归。abc的所有组合值可以分为以下部分:

1. a + 剩余字母组合值;

2. b+ 剩余字母组合值;

3. c+剩余字母组合值;

实现

function getPerputation2(str){
if(str.length ==1){
return [str];
}
let res = [];
for(let i = 0; i < str.length; i++){
let restStr = str.slice(0,i)+str.slice(i+1);
let restArr = arguments.callee(restStr);
restArr=restArr.map(x => str[i] + x);
res = res.concat(restArr);
}
return res;
}

console.log(getPerputation2("abc"));


不重复字符串的排列组合

思路

先求组合值,对每个可能的组合值进行排列

实现

function getComAndPer(str){
let comArr = getCombination(str);
let res =[]
for(let i = 0;i < comArr.length; i++){
let perArr = getPerputation(comArr[i]);
res = res.concat(perArr);
}
return res;
}
console.log(getComAndPer("abc"));
//["abc", "bac", "bca", "acb", "cab", "cba", "ac", "ca", "ab", "ba", "bc", "cb", "c", "b", "a"]


可能存在重复元素时

对于可能存在重复的字符串,按照上述方法求排列组合之后的结果可能存在重复值。可以对结果进行去重后再返回。

例如,求aabc的组合值。

function getComWithRepeat(str){
let resWithReapeat = getCombination(str);
return [...new Set(resWithReapeat)]
}

console.log(getComWithRepeat("aac"));
//["aac", "ac", "aa", "c", "a"]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息