1. 程式人生 > >No repeats please(freecodecamp高級算法6)

No repeats please(freecodecamp高級算法6)

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)