1.對於無重複值的情況
** 固定第乙個字元,遞迴取得首位後面的各種字串組合;
* 再把第乙個字元與後面每乙個字元交換,並同樣遞迴獲得首位後面的字串組合; *遞迴的出口,就是只剩乙個字元的時候,遞迴的迴圈過程,就是從每個子串的第二個字元開始依次與第乙個字元交換,然後繼續處理子串。
*2.假如有重複值呢?
*由於全排列就是從第乙個數字起,每個數分別與它後面的數字交換,我們先嘗試加個這樣的判斷——如果乙個數與後面的數字相同那麼這兩個數就不交換了。
* 例如abb,第乙個數與後面兩個數交換得bab,bba。然後abb中第二個數和第三個數相同,就不用交換了。
* 但是對bab,第二個數和第三個數不 同,則需要交換,得到bba。
* 由於這裡的bba和開始第乙個數與第三個數交換的結果相同了,因此這個方法不行。
** 換種思維,對abb,第乙個數a與第二個數b交換得到bab,然後考慮第乙個數與第三個數交換,此時由於第三個數等於第二個數,
* 所以第乙個數就不再用與第三個數交換了。再考慮bab,它的第二個數與第三個數交換可以解決bba。此時全排列生成完畢!
最簡單的:
class
solution
permution
(str,i,result)
;sort
(result.
begin()
, result.
end())
; vector
::iterator it;
for(it = result.
begin()
;(it+1)
!= result.
end();
)else
it++;}
return result;
}void
permution
(string str,
int i, vector
& result)
for(
int j = i; j < str.
length()
;j++)}
};
改進一下:
public arraylist
permutation
(string str)
return list;
}private
void
permutationhelper
(char
chars,
int i,arraylist list)
else}}
}private
void
swap
(char
cs,
int i,
int j)
考慮字典演算法:參考
public arraylist
permutation2
(string str)
char
chars = str.
tochararray()
; arrays.
sort
(chars)
; list.
add(string.
valueof
(chars));
int len = chars.length;
while
(true)if
(lindex ==0)
break
; rindex = lindex;
while
(rindex>chars[lindex-1]
)swap
(chars,lindex-
1,rindex-1)
;reverse
(chars,lindex);
list.
add(string.
valueof
(chars));
}return list;
}private
void
reverse
(char
chars,
int k)
}}
全排列演算法 C語言
includevoid swap int a,int x,int y void perm int a,int m,int n 全排列函式 if m n for int i 0 i思路,比如要求12345的全排列,那可以先求出以1開頭,2345剩下四個數的全排列,以此類推,求出2開頭,3開頭的,最後求...
演算法 全排列
從n個不同元素中任取m m n 個元素,按照一定的順序排列起來,叫做從n個不同元素中取出m個元素的乙個排列。當m n時所有的排列情況叫全排列。用演算法分別實現全排列,其中n個元素儲存在乙個長度為n的陣列中。實現全排列之前,先看一下對進行全排列的一種方法 從圖中可以看出,我們首先從n個元素中取出乙個元...
全排列演算法
1.遞迴全排列 分別將每個位置交換到最前面位,之後全排列剩下的位。遞迴全排列 1 2 3 4 5 1,for迴圈將每個位置的資料交換到第一位 swap 1,1 5 2,按相同的方式全排列剩餘的位 2.字典序全排列演算法 對給定的字符集中的字元規定了乙個先後關係,在此基礎上規定兩個全排列的先後是從左到...