javascript 字符串的排列与组合
2018-03-27 16:06
302 查看
不重复字符串的组合
输入 | 输出 |
---|---|
没有重复值的字符串 | 所有可能的组合值 |
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"]
相关文章推荐
- JAVA 输出指定字符串所有排列组合
- 12个字母任选5个进行排列组合,不可重复 javascript 递归实现
- 编程之法:字符串的排列组合
- 字符串的排列与组合
- javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号
- 剑指Offer28字符串的排列(递归和非递归实现)扩展有重复元素的排列,字符串的组合种类
- 字符串的排列组合问题
- 给定一个字符串,输出所有的排列组合方式
- 每天一道算法题(21)——字符串的全排列和组合算法
- 字符串的排列与组合
- 一道字符串排列组合算法题
- 字符串排列与组合
- 字符串的排列和组合代码 C++
- 字符串的排列和组合
- java实现字符串排列组合问题
- c++字符串的排列组合
- 剑指Offer面试题28字符串的排列组合(递归和栈)
- javascript 写了个字符串组合的情况
- 字符串排列和组合的JAVA实现 [No. 44]
- 【剑指offer】字符串的排列与组合