FCC(ES6寫法) No repeats please

把一個字符串中的字符從新排列生成新的字符串,返回新生成的字符串裏沒有連續重複字符的字符串個數.連續重複只以單個字符爲準。javascript

例如, aab 應該返回 2 由於它總共有6中排列 (aab, aab, aba, aba, baa, baa), 可是隻有兩個 (aba and aba)沒有連續重複的字符 (在本例中是 a)。java

 

思路:git

1.一個正則判斷重複,把字符串換成數組,用ES6的解構和箭頭函數來交換位置,array裏面放字符串能組成的全部排列。github

2.用一個生成函數來生成全部的排列,這裏用的是Heap's Algorithm全排列算法,最後返回過濾掉重複的數組的長度便可。算法

 

let permAlone = str => {
  const reg = /(.)\1+/g,arr = str.split('') , array = [];
  let swap = (i1, i2) => [arr[i1],arr[i2]] = [arr[i2],arr[i1]];
  let generate = len => {
    if (len === 1) {
      array.push(arr.join(''));
    } else {
      for (let i = 0; i < len; i++) {
        generate(len - 1);
        swap(len % 2 ? 0 : i, len - 1);
      }
    }
  };
  generate(arr.length);
  return array.filter( str => !str.match(reg) ).length;
};
permAlone('aab');

  

若是有不明白的地方請留言,若是有更好更簡便更優化的方法請留言,謝謝。數組

 

更多內容請訪問個人我的博客: Bblogapp

相關文章
相關標籤/搜索