51nod 1384

给出一个字符串S(可能有重复的字符),按照字典序从小到大,输出S包括的字符组成的所有排列。例如:S = “1312”,
输出为:1123
1132
1213
1231
1312
1321
2113
2131
2311
3112
3121
3211

参阅网上资料,只有用dfs和next_permutation(s,s+n)函数两种方法。因为本人能力有限,只好都拿来借鉴(chaoxi)一下

#include <iostream>
#include<cstring>
#include<algorithm>
using namespace std;
char s[50],ans[50];
bool v[50];
int n;

void dfs(int cnt)
{
	if(cnt==n)
	{
		cout<<ans<<endl;
		return ;
	}
	
	for(int i=0;i<n;++i)
	{
		if(!v[i])
		{
			v[i]=1;
			ans[cnt]=s[i];
			dfs(cnt+1);
			v[i]=0;
			while(i<n&&s[i]==s[i+1]) ++i;
		}
	}
}

int main() {
	cin>>s;
	n=strlen(s);
	sort(s,s+n);
	dfs(0); 
    return 0;
}

next_permutation(s,s+n)对s到s+n位置的元素进行排列,他是把当前元素按照升序一个大小来排列。并且返回是否排列成功,而且修改了s的本地内容。每次都把当前的s变大一下。(总结的不是很好,并且发现表达的不清楚,具体按照代码来理解吧),似乎根据参数来看。只能是连续的内容进行排序。

#include <iostream>
#include<cstring>
#include<algorithm>
using namespace std;

int main() {
	char s[50];
	int n;
	cin>>s;
	n=strlen(s);
	sort(s,s+n);
	do{
		cout<<s<<endl;
	}while(next_permutation(s,s+n));
    return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
02-12 10:05
小米集团 算法工程师 28.0k*15.0
泡沫灬一触即破:楼上那个看来是看人拿高薪,自己又不如意搁这泄愤呢是吧,看你过往评论很难不怀疑你的精神状态
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务