前言
顺便将字符串的排列一起写上。
题目:
求字符串(或n个字符)的所有排列。比如,输入abc,则它的组合有abc,acb,bac,bca,cab,cba。
解决思路:
还是同样的思路,将字符串分成两个部分:第一个字符和剩下所有字符。然后,
第一步,求所有可能出现在第一个字符位置的字符,即把第一个字符依次与后面所有字符做交换;
第二步,固定第一个位置的字符,求剩下所有字符的排列。然后,继续将剩下所有字符分成两部分:第一个个字符和剩下所有字符,重复第一步,第二步...
以下是代码实现:
void swap(char *a, char *b)
{
char temp = *a;
*a = *b;
*b = temp;
}
void PermutationCore(char* pStr, char* pBegin)
{
if (*pBegin == '\0')
{
printf("%s\n", pStr);
return;
}
for (char *c = pBegin; *c != '\0'; c++)
{
swap(c, pBegin); // 交换第一个与后续每一个字符,并固定住第一个字符
PermutationCore(pStr, pBegin + 1); // pStr用来打印整个排列后的字符串
swap(c, pBegin); // 每固定住第一个字符排列完后再换回原序列
}
}
void Permutation(char* pStr)
{
if (pStr == NULL )
{
return;
}
PermutationCore(pStr, pStr);
}
测试结果: