现在的位置: 首页 > 综合 > 正文

第二十五题 求取字符串的排练组合输出

2018年04月13日 ⁄ 综合 ⁄ 共 871字 ⁄ 字号 评论关闭

题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符abc所能排列出来的所有字符串abcacbbacbcacabcba

思路:以三个字符abc为例来分析一下求字符串排列的过程。首先我们固定第一个字符a,求后面两个字符bc的排列。当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac,接着我们固定第一个字符b,求后面两个字符ac的排列。现在是把c放到第一位置的时候了。记住前面我们已经把原先的第一个字符a和后面的b做了交换,为了保证这次c仍然是和原先处在第一位置的a交换,我们在拿c和第一个字符交换之前,先要把ba交换回来。在交换ba之后,再拿c和处在第一位置的a进行交换,得到cba。我们再次固定第一个字符c,求后面两个字符ba的排列。

#include <iostream>
using namespace std;
//交换指针所指的元素
void swap(char *&p1,char *&p2){
	char temp=*p1;
	*p1=*p2;
	*p2=temp;
}
//获取字符的排练组合
void getstrcount(char *str,char *beg)
{
	if (str==nullptr||beg==nullptr)
	{
		return;
	}
	//递归结束,即输出此时的字符串
	if (*beg=='\0')
	{
		for (int i=0;i<strlen(str);++i)
		{
			cout<<*(i+str);
		}
		cout<<endl;
	}
	else
	{
		//每次递归都是将倒数第3个字符不变,将字符串的最后2个字符的2种排列输出,然后交换倒数第3个字符与后2个字符
		for (char *it=beg;*it!='\0';++it)
		{
			swap(it,beg);
			getstrcount(str,beg+1);
			swap(it,beg);
		}
	}
}
int main()
{
	char test[5] = "abcd";
	//char *beg=nullptr;
	//beg=str;
	getstrcount(test,test);
	return 0;
}

抱歉!评论已关闭.