用递归的方法来实现强大的全排列功能

题目描述:

输入一行字符串,然后将字符串中的所有字符进行全排列,然后按照从小到大的顺序输出,每个输出占一行。

输入输出示例:

输入数据:

abc

输出数据:

abc
acb
bac
bca
cab
cba


分析:

使用string来保存字符串,便于拆分和分割。使用vector来保存全排列的结果,便于操作和排序。

用户输入一个字符串str,程序的任务是对str求全排列,也就是求str[0]~str[length-1]的全排列

可以分为先求str的第一个字符str[0],然后求str[1]~str[length-1]的全排列,然后将str[0]分别插入到这些全排列的不同的位置中;

然后求str[1]~str[length-1]的全排列,有可以分成先求str[1],然后求str[2]~str[length-1]的全排列,然后将str[1]插入到不同的位置中;

由此得到递归,

求str[n]~str[length-1]的全排列,分为先求str[n+1]~str[length-1]的全排列,然后将str[n]分别插入到这个全排列的每个结果的所有的位置;

当n = length -1 的时候,找到递归的出口。

通过递归获得str的全排列,然后通过stl中的sort函数,进行排序。


程序代码:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
vector<string> fun(string str)
{
	vector<string> v;
	if(str.length()==1)	//递归的出口 
	{
		v.push_back(str);
		return v;
	}
	char c = str[0];
	string x = str.substr(1);
	vector<string> t = fun(x);	
	for(int i=0;i<t.size();i++)		//n-1个字符的全排列 
	{
		for(int j=0;j<= t[i].length();j++)//对于每一种排列情况,"见缝插针" 
		{
			//将每一个字符串从j处分隔开,然后插入c 
			string temp = t[i].substr(0,j)+c+t[i].substr(j);
			v.push_back(temp);
		}
	}
	sort(v.begin(),v.end());
	return v;
}
int main()
{
	string str;
	cin>>str;
	vector<string> v;
	v = fun(str);
	vector<string>::iterator p;
	for(p=v.begin();p<v.end();p++)
	{
		cout<<*p<<endl;
	}
	return 0;
}



转载于:https://www.cnblogs.com/zhezh/p/3773480.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值