字符串的全排列

我们以三个字符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>
using namespace std;
void permutation(char *pstr,char *pbegin)
{
	if(!pstr||!pbegin)return;
	if(*pbegin=='\0')cout<<pstr<<endl;
	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;
		}
	}
}
int main()
{
	char pstr[10];
	while(cin>>pstr)
	{
		permutation(pstr,pstr);
	}
	return 0;
}
原文地址:https://www.cnblogs.com/tgkx1054/p/2736242.html