javascript 字符串的排列与组合

不重复字符串的组合

输入输出
没有重复值的字符串所有可能的组合值
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"]
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值