全排列算法---简单理解实现

###全排列

    function permutate(str) {
        var result=[];
        if(str.length==1){
            return [str]
        }else{
            var preResult=permutate(str.slice(1));
            for (var j = 0; j < preResult.length; j++) {
                for (var k = 0; k < preResult[j].length+1; k++) {
                    var newlist=preResult[j].slice(0,k)+str[0]+preResult[j].slice(k);
                    result.push(newlist);
                }
            }
            return result;
        }
    }
    function checkout(){
        var str = document.getElementById("permutate").value;
        var list = permutate(str);
        console.log(list);
        alert("查看具体结果请在console界面查看,输入的结果长度 : "+list.length);
    }

全排列算法实现方法:
实现思路:递归法;把字符串分解成不再分状态,把不可再分状态作为结果返回,然后进行插入排序,层层结算,返回最终结果。

  • 通过一个简单的例子来说明一下,比如字符abc,abc作为传入参数,由于其长度不为1,将其分解为a和bc,然后把bc递归,由于bc的长度依旧不是1;
  • 将其分解为b和c然后将c继续作为参数成进行递归,由于此时已经将字符串分解为不可再分状态,所以将c作为最终结果返回到上一级的递归;
  • 上一级的递归是把bc分解成b和c,所以这一级的在进行插入排序之后的返回结果是[“bc”,“cb”],这一级的结果继续返回上一层,上一层的递归是abc分成a和bc,
    把a插入到返回结果中,结果变成[“abc”,“bac”,“bca”,“acb”,“cab”,“cba”].
function permutate(str) {
      var result = []
      if (str.length == 1) {
        return [str]
      } else {
        var preResult = permutate(str.slice(1))
        for (var j = 0; j < preResult.length; j++) {
          for (var k = 0; k < preResult[j].length + 1; k++) {
            var newlist =
              preResult[j].slice(0, k) + str[0] + preResult[j].slice(k)
            result.push(newlist)
          }
        }
        return result
      }
    }

如果想去除由于输入字符串中存在字符相同相邻的而出现重复的子项,可以通过正则表达式:var regxe = /(.)\1+/g 来去除重复项。code:

var newResult = result.filter(function(string) {return !string.match(regex);});

全排列一行代码实现:

function permutations(string) {
      return string.length == 1
        ? [string]
        : string
            .split('')
            .map((e, i) =>
              permutations(string.slice(0, i) + string.slice(i + 1)).map(
                (e2) => e + e2
              )
            )
            .reduce((r, e) => r.concat(e))
            .sort()
            .filter((e, i, a) => i == 0 || a[i - 1] != e)
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值