1.不存在重复字符的排列组合
如abc,此种情况很简单,算法代码也很少,主要思想为:
- 将abc分为前部和后部,前部为a,后部abc,用a与后部每一个字符交换,如a<->a得到abc,a<->b得到bac,a<->c得到cba,最终得到abc,bac,cba三部分
- 针对上一部分中的三个后部,分别继续应用分两部,分别交换的方法,直到后部为NULL,递归输出字符串。
上述方法的递归代码如下:
#include<iostream>
using namespace std;
void swap(char *pChar1,char *pChar2)
{
char temp;
temp=*pChar1;
*pChar1=*pChar2;
*pChar2=temp;
}
void FullArry(char *cStr,char *pFirstChar)
{
char *pNode;
if(NULL==cStr)
return;
if('\0'==*pFirstChar)
{
cout<<cStr<<endl;
}
for(pNode=pFirstChar;*pNode!='\0';pNode++)
{
swap(pFirstChar,pNode);
FullArry(cStr,pFirstChar+1);
swap(pFirstChar,pNode);
}
return ;
}
int main()
{
char a[10000];
cin>>a;
FullArry(a,a);
return 0;
}
输入abc,结果为:
如果输入abb
2.存在重复字母的排列组合
结果显然不符合要求,原因是因为 1.前部与后部相同的情况,我们进行了对换。2.后部如果有多个字符相同,只需要在该字符第一次出现的时候对换前后部字符。
针对上述的情况,修改代码如下&