JS算法——No repeats

把一个字符串重新排列为新的字符串,同时去除相同的排列组合

这个算法其实我们都不陌生,就是中学学习的排列组合。

用程序语言来实现的话,就需要用到递归。

在本算法中,根据传入字符串的长度,我们要对其进行相应的递归次数

如"abc",按照排列组合,我们首先应该分别把"a","b","c"作为首个字符,然后分别对剩下的两个字符进行排列,由此我们可以利用递归来实现这个逻辑。

function getPermutations(str){
    //声明递归内部使用的局部变量
    var permutations = [],  //用于存储新组合成的字符串的数组
        nextWord = [],      //用于储存下一个拼接的字符 
        chars = []          //用于储存不同阶段的递归调用的参数
    ;
    //---------------------
    //将传进来的字符串或者数字转换为数组
    if (typeof str === 'string') chars = str.split(''); 
    else if (typeof str === 'number') {
      str = str + "";
      chars = str.split('');
}
    //============主要执行语句========
    permutate(chars);
    return permutations.filter(function(val,index,array){
      return array.indexOf(val)===index;
    });
    
    //===========递归函数声明===========
    function permutate(chars){ //递归函数:生成新的排列
        if(chars.length === 0)permutations.push(nextWord.join(''));            
        for (var i=0; i < chars.length; i++){
            chars.push(chars.shift());  //首尾交换
            nextWord.push(chars[0]);    //把第一个字符压入数组    
            permutate(chars.slice(1));  //递归调用,每次递归都比之前少一个字符
            nextWord.pop();             //清除之前压入数组的字符
        }
    }
    //--------------------------------
}

参考资料:

http://codereview.stackexchange.com/questions/59615/recursive-function-that-generates-the-permutations-of-a-string

转载于:https://my.oschina.net/JSBreaker/blog/800168

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值