劍指offer| |字串的排列
阿新 • • 發佈:2018-12-09
題目: 輸入一個字串,打印出該字串中字元的所有排列。例如輸入字串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);
}