题目:输入一个字符串,打印出该字符串中字符的所有排列。例如,输入字符串abc,则打印出有字符a、b、c所能排列出来的所有字符串abc、acb、bca、cab和cba。
思路:
这道题让我想起来了青蛙跳台阶的问题,看起来比较复杂,实际上可以把复杂问题划分成为一个简单问题。这里可以把序列分为两个部分,第一个数字为一个部分,后面的序列为另一个部分。首先依次将a与后面的b、c等字符交换位置可以得到一些序列,然后保持这些序列的第一个字符不变,将第二个字符和后面的字符依次交换,得到一些序列,依此类推,可以递归地得到所有的序列。注意,每次交换之后还有一个还原的操作,因为输出的始终是str序列,没有建立新的序列,输出一个序列后就要还原到上一个状态,递归的代码总是有点绕,要多看多写几遍。
代码:
void Permutation(char* pStr)
{
if (pStr == nullptr)
return;
Permutation(pStr, pStr);
}
void Permutation(char* pStr, char* pBegin)
{
if (*pBegin == '\0')
{
printf("%s\n", pStr);
}
else {
for (char* pCh = pBegin; *pCh != '\0'; ++pCh)
{
char temp = *pCh;
*pCh = *pBegin;
*pBegin = temp;
Permutation(pStr, pBegin + 1);
temp = *pCh;
*pCh = *pBegin;
*pBegin = temp;
}
}
}