No repeats please

这是一道题:把一个字符串中的字符重新排列生成新的字符串,返回新生成的字符串里没有连续重复字符的字符串个数.连续重复只以单个字符为准

例如, aab 应该返回 2 因为它总共有6中排列 (aab, aab, aba, aba, baa, baa), 但是只有两个 (aba and aba)没有连续重复的字符 (在本例中是 a).

function permAlone(str) {
        var arr1 = str.split("");
        var arr2 = [];
        var arr3 = [];
        var arr4 = [];
        //创建相同字符的数组arr3
        arr1.forEach(function(val){
            arr2.push([val,val]);
        });
        console.log(arr2);
        arr2.forEach(function(val){
            arr3.push(val.join(""));
        });
        console.log(arr3);
        //把arr3中重复的字符去掉,简化工作(其实还应该简化一下,arr1中并不是所有的字符都有重复)
        arr3.forEach(function(val){
            if(arr4.indexOf(val)==-1){
                arr4.push(val);
            }
        });
        console.log(arr4);
            //全排列函数
    function permute(input) {
  var permArr = [],
  usedChars = [];
  function main(input){
    var i, ch;
    for (i = 0; i < input.length; i++) {
      ch = input.splice(i, 1)[0];
      usedChars.push(ch);
      if (input.length == 0) {
        permArr.push(usedChars.slice());
      }
      main(input);
      input.splice(i, 0, ch);
      usedChars.pop();
    }
    return permArr;
  }
  return main(input);
};
//应用全排列算法后得到arr一个二维数组
var arr = permute(str.split(""));
console.log(arr);
var arr0 = [];
//转换为一维数组
arr.forEach(function(val){
    arr0.push(val.join(""));
});
console.log(arr0);
//正则表达式匹配测试
arr4.forEach(function(val){
    reg = new RegExp(val,"");
//划重点,这个地方加过一个全局匹配(val,"g"),结果像["baa","baa"]这个数组只匹配一个;见文章末尾链接
    function contac(va){
        return !reg.test(va);
    }
    arr0 = arr0.filter(contac);
    console.log(arr0);  
});
//console.log(arr0);
return arr0.length;
  //return str;
}
permAlone("abcdefa");
permAlone("aab");

js使用filter和正则表达式过滤数组和预期的不一样
RegExp.lastIndex

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值