No repeats please(freecodecamp高級算法6)
阿新 • • 發佈:2017-08-29
perm clas str 返回 ppa 相同 procedure array 單個
把一個字符串中的字符重新排列生成新的字符串,返回新生成的字符串裏沒有連續重復字符的字符串個數.連續重復只以單個字符為準
例如, aab
應該返回 2 因為它總共有6中排列 (aab
, aab
, aba
, aba
, baa
, baa
), 但是只有兩個 (aba
and aba
)沒有連續重復的字符 (在本例中是 a
).
function permAlone(str) { //使用正則匹配連續重復 var regex = /(.)\1+/g;//括號代表分組,\1表示獲得和第一個分組裏完全相同的內容 //把字符串轉化為數組,便於處理 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(n) { if (n === 1) { permutations.push(arr.join(‘‘)); } else { for (var i = 0;i< n ; ++i) {generate(n - 1); swap(n % 2 ? 0 : i, n - 1); } } } generate(arr.length); //把沒有連續重復排列的數組過濾出來 var filtered = permutations.filter(function(string){ return !string.match(regex); }); //返回其數量 return filtered.length; } alert(permAlone("aabfcdf"));
Heap‘s algorithm全排列算法
procedure generate(n : integer, A : array of any): if n = 1 then output(A) else for i := 0; i< n - 1; i += 1 do generate(n - 1, A) if n is even then swap(A[i], A[n-1]) else swap(A[0], A[n-1]) end if end for generate(n - 1, A) end if
i=n時,算法產生所有全排列;
如果n是奇數,則將排列裏的第一個元素與最後一個元素互換。如果n是偶數,將排列的第i個元素與最後一個元素互換。
No repeats please(freecodecamp高級算法6)