求字符串全排列

Q:输入一个字符串,打印出该字符串中字符的所有排列


A:以abc为例,我们首先将a固定在第一位,然后排列bc,当bc排列完成后,我们会将b固定在第一位,也就是交换a和b的位置,变成bac,然后排列ac,当ac排列完成后,我们需要将c固定在第一位,先将a和b的位置复原,在交换a和c的位置即可。因此,用递归来求解再自然不过。对于字符串abcdedfgh….,在以begin为开头的子串中,我们要依次将子串的每一个字符固定在首位,这需要依次swap操作,然后我们递归的处理子串开头之后的更小子串的排列,当处理好之后,我们回到该子串,再将刚才的swap操作重新操作一遍。


#include <iostream>
using namespace std;

void Arrange(char* str,char* begin)
{
	if(!str || !begin)
		return;
	if(*begin=='\0')
		cout <<str<<endl;
	else
	{
		for(char* p=begin;(*p)!='\0';++p)
		{
			char temp=*p;
			*p=*begin;
			*begin=temp;
			Arrange(str,begin+1);
			temp=*p;
			*p=*begin;
			*begin=temp;
		}
	}
}


int main()
{
	char str[50];
	while(cin >>str)
		Arrange(str,str);
	return 0;
}
posted @ 2012-06-14 19:45  Cavia  阅读(1014)  评论(0编辑  收藏  举报