不重复字符串的组合
输入 | 输出 |
---|---|
没有重复值的字符串 | 所有可能的组合值 |
abc | a,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"]
不重复字符串的排列
输入 | 输出 |
---|---|
不重复字符串 | 所有可能的排列值 |
abc | abc,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"]