No repeats please

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

例如, 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)