No repeats please

作者: Awoooo | 来源:发表于2017-11-02 08:42 被阅读0次

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

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

    难点在于列举排列组合,获取到所有的排列组合再去重复可得解。
    排列组合已经有现成的算法,Pascal语言版,详情可以查看https://en.wikipedia.org/wiki/Heap%27s_algorithm

    javascript实现

    function heap(string) {
      var arr = string.split(''),  
        permutations = [];      
     
      function swap(a, b) {    
        var tmp = arr[a];
        arr[a] = arr[b];
        arr[b] = tmp;
      }
     
      function gen(n) { 
        if (n === 1) {   
          permutations.push(arr.join('')); 
        } else {
          for (var i = 0; i != n; i++) {
            gen(n - 1);
            swap(n % 2 ? 0 : i, n - 1);
          }
        }
      }
     
      gen(arr.length);
      return permutations;
    }
    

    其次是重复字符的正则表达式 var reg = /(.)\1/;

    最终代码

    function permAlone(string) {
     
      return heap(string).filter(function(item) {
        return !/(.)\1/.test(item);
      }).length;
     
      function heap(string) {
        var arr = string.split(''),
          permutations = [];
     
        function swap(a, b) {
          var tmp = arr[a];
          arr[a] = arr[b];
          arr[b] = tmp;
        }
     
        function gen(n) {
          if (n === 1) {
            permutations.push(arr.join(''));
          } else {
            for (var i = 0; i != n; i++) {
              gen(n - 1);
              swap(n % 2 ? 0 : i, n - 1);
            }
          }
        }
     
        gen(arr.length);
        return permutations;
      }
    }
    

    相关文章

      网友评论

        本文标题:No repeats please

        本文链接:https://www.haomeiwen.com/subject/largpxtx.html