我们以三个字符abc为例来分析一下求字符串排列的过程。首先我们固定第一个字符a,求后面两个字符bc的排列。当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac,接着我们固定第一个字符b,求后面两个字符ac的排列。现在是把c放到第一位置的时候了。记住前面我们已经把原先的第一个字符a和后面的b做了交换,为了保证这次c仍然是和原先处在第一位置的a交换,我们在拿c和第一个字符交换之前,先要把b和a交换回来。在交换b和a之后,再拿c和处在第一位置的a进行交换,得到cba。我们再次固定第一个字符c,求后面两个字符b、a的排列。
#include<iostream.h>
bool repeatnumber(char *bg,char *pch)
{
bool f=false;
for(char *q=bg;q!=pch;q++)
if(*q==*pch)
{
f=true;
break;
}
return f;
}
void pailie(char *ch,char *bg)
{
if(*bg=='\0')
cout<<ch<<endl;
else
{
char tmp;
for(char *pch=bg;*pch!='\0';pch++)
{
/*为了防止字符串中有相同的字符而造成排除的序列一样
而设置repeatnumber()函数进行检查,从bg到pch-1中间是不是
有和pch相同的字符,如果有就说明已经和前面的bg互换完成
不需要继续互换否则就会重复直接下一步
*/
if(bg!=pch&&repeatnumber(bg,pch))
continue;
tmp = *bg;
*bg = *pch;//开始这里面一直报错,错误原因如下图,感谢csdn网友Fire_Lord的帮助
*pch = tmp;
sequence(ch,bg+1);
tmp = *bg;
*bg = *pch;
*pch = tmp;
}
}
}
void main()
{
char ch[]="abcde";
pailie(ch,ch);
}