No repeats please (FCC高级算法)

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

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

 

重点:

  这题应该是高级算法最难的一题了,我到现在都还是不太理解 。   递归有点糊涂  ,  首先要去了解全排列 , 这段代码我是看的@Aaron_L 的全排列程序 https://www.cnblogs.com/nowornever-L/p/6008954.html,  讲的也清楚   但是他是c++代码  

 

js代码如下:

function permAlone(str) {
  // 匹配重复字符,若匹配出的字符不是空 ,则判断0号索引是否与原字符串相同 ,若相同则该字符串由同一个字符组成
  var reg = str.match(/(.)\1+/g);
  if(reg!=null && reg[0] === str) {
    return 0;
  }
  var arr = str.split('');
  var arrs = [];
  //将两元素值对调
  function swap(array,  i,  j)
  {
    var t = array[i];
    array[i] = array[j];
    array[j] = t;
  }
  //全排列递归函数
  function fullArray( array , index){
    if(index >= array.length)
    {
        arrs.push(arr.join(''));
    }
    else {
      for( var i = index; i < array.length; i++)
      {
          swap(array, i, index);
          fullArray(array , index + 1);
          swap(array, i, index);
      }
    }
  }
  fullArray( arr , 0);
  //返回没有两字符重复在一起的数量
  return arrs.filter(function(str){
      return !str.match(/(.)\1+/g);
  }).length;
}

 

posted on 2018-01-11 10:28  辣条菌的思维屋i  阅读(670)  评论(0编辑  收藏  举报