题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串:abc,acb,bac,bca,cab,cba.
对于这样的题目,我可以将问题进行分解。把一个字符串看成两个部分。
第一部分为它的第一个字符;第二部分为它的后面的所有字符。
具体分析如下图所示:
具体实现代码如下:
对于这样的题目,我可以将问题进行分解。把一个字符串看成两个部分。
第一部分为它的第一个字符;第二部分为它的后面的所有字符。
首先求出所有可能在第一个位置的字符,即把第一个字符和后面的每个字符一次交换,得到所有可能在第一个位置的字符;然后将剩下的部分任然看成两部分,进行递归操作;直到字符串末尾。
当然还得考虑去重复的过程。
例如abb ,由于bb一样,所以不用交换。具体分析如下图所示:
具体实现代码如下:
#include <iostream>
using namespace std;
char str[]="abc";
char str1[]="abb";
bool IsSwap(char *bBegin,char *pEnd) //去重复函数;
{
char *p=bBegin;
for(p;p<pEnd;p++)
if(*p==*pEnd)
return false;
return true;
}
void Swap(char &a,char &b)
{
char temp=a;
a=b;
b=temp;
}
void PermutationHelp(char *pstr,char *pBegin)
{
if(*pBegin=='\0')
cout<<pstr<<endl;
else
{
for(char *ch=pBegin;*ch!='\0';ch++)
{
if(IsSwap(pBegin,ch))
{
Swap(*ch,*pBegin);
PermutationHelp(pstr,pBegin+1);
Swap(*ch,*pBegin);
}
}
}
}
void Permutation(char *str)
{
if(NULL==str)
return;
else
PermutationHelp(str,str);
}
int main()
{
Permutation(str);
cout<<endl;
Permutation(str1);
system("pause");
return 0;
}
运行结果: