【Javascript】No Repeats Please

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

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

function permAlone(str) {

  //使用正则回溯匹配连续重复
  var regex = /(.)\1+/g;

  //把字符串转化为数组,便于处理
  var arr = str.split('');
  //储存全排列数组
  var permutations = [];
  var tmp;

  //函数功能:对调位置
  function swap(index1, index2) {
    tmp = arr[index1];
    arr[index1] = arr[index2];
    arr[index2] = tmp;
  }

  //使用Heap's Algorithm生成全排列数组
  function generate(int) {
    if (int === 1) {
      permutations.push(arr.join(''));
    } else {
      for (var i = 0; i != int; ++i) {
        generate(int - 1);
        swap(int % 2 ? 0 : i, int - 1);
      }
    }
  }

  generate(arr.length);

  //把没有连续重复排列的数组过滤出来
  var filtered = permutations.filter(function(string) {
    return !string.match(regex);
  });

  //返回其数量
  return filtered.length;
}

例如permAlone("aab")的结果输出为2。

THE END.

你可能感兴趣的:(【Javascript】No Repeats Please)