JS全排列

给定一个字符串或者数组,输出所有排列的可能。如输入“abc或者['a','b','c']”,输出['abc','acb','bca','bac','cab','cba']。

 //   全排列
    function fullpermutate(str) {
        // 验证参数只能是数组或者字符串
      var typeValue = Object.prototype.toString.call(str).slice(8,-1).toLowerCase();
      if(!['string','array'].includes(typeValue)) throw Error("参数必须为数组或者字符串")
      str = typeValue === 'array' ? str.join('') : str
      var result = [];
      var len = str.length;
      if (str.length <= 1) return [str]; //如果长度小等于1,则返回本身
      for (var m = 0; m < len; m++) {
        var left = str[m];
        // 没过滤有空格的情况,把每个空格也当做字符来计算
        if (left === str[m + 1]) continue; //如重复则跳过,如输入11 则直接返回[11]即可,不需要返回 [11,11],看你需求
          //   除当前的元素和其他元素组合
          var rest = str.slice(0, m) + str.slice(m + 1, len);
          // 递归上一次返回的全排列
          var preResult = fullpermutate(rest);
          // 组合在一起
          for (var i = 0; i < preResult.length; i++) {
            var tmp = left + preResult[i];
            result.push(tmp);
          }
      }
      return result;
    }
    console.log(fullpermutate('abc')); //['abc', 'acb', 'bac', 'bca', 'cab', 'cba']
    console.log(fullpermutate(['a','a','b'])) //['aab', 'aba', 'baa']

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值