1. 程式人生 > >劍指offer| |字串的排列

劍指offer| |字串的排列

題目: 輸入一個字串,打印出該字串中字元的所有排列。例如輸入字串abc,則打印出字串a,b,c所能排列出來的所有字元abc,acb,bac, bca, cab和cba.

思路: 1. 可以將字串看成兩部分,一部分是第一個字元,另一部分是剩下的所有字元。 2. 將第一個字元分別於後面的每一個字元分別進行交換 3. 交換之後再將後面的字元也看成兩部分,然後重複2,3直到該字串交換到了最後一個字元了(這顯然就是一個遞迴的過程) 4. 每次交換交換之後,然後要返回到上一層遞迴的時候,必須要將剛才交換的字元在交換回來,以防止進行下一次的時候。字串沒有發生改變

程式碼:

//字串的排列
void Swap(char* s1, char* s2) { assert(s1 && s2); char tmp = *s1; *s1 = *s2; *s2 = tmp; } void ChangeFristChar(char* pStr, char* pBegin) { assert(pStr && pBegin); if (*pBegin == '\0') { printf("%s\n", pStr); } else { //pC表示的是,依次要與第一個字元交換的字元
for (char* pCh = pBegin; *pCh != '\0'; pCh++) { Swap(&(*pCh), &(*pBegin)); ChangeFristChar(pStr, pBegin + 1); Swap(&(*pCh), &(*pBegin)); } } } void Permutation(char* pStr) { assert(pStr); ChangeFristChar(pStr, pStr); }