javascript 字符串的排列与组合

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32657025/article/details/79506033

不重复字符串的组合

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

猜你喜欢

转载自blog.csdn.net/qq_32657025/article/details/79506033