UVa 10098: Generating Fast

这道题要求按字典序生成字符串的全排列,不可重复(但字符可以重复,且区分大小写)。

基本思路是先对输入的字符串按字典序排序,然后从第一位开始递归,从所有输入的字符中选出一个填充,然后再选第二位......具体实现看代码。

要注意的是最后的输出方式,不小心的话会莫名其妙的WA,详情见代码。

我的解题代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <string>
#include <algorithm>
using namespace std;

char s[15],ss[15];
int N;

int cmp(const void *a, const void *b)
{
	return *(char *)a-*(char *)b;
}

void print_permutation(int cur, int len)
{
	if(cur==len)	//满足此条件则ss已经填满,输出
	{
		for(int i=0; i<len; i++) cout << ss[i]; cout << endl;	//这里用cout << ss << endl; 提交就WA了,天知道怎么回事 = - =
		return ;
	}
	for(int i=0; i<len; i++) if(!i || s[i]!=s[i-1])	//判断是否与上一个待选字符是相同的,如果相同就跳过
	{
		int c1=0,c2=0;
		for(int j=0; j<len; j++) if(s[j]==s[i]) c1++;
		for(int j=0; j<cur; j++) if(ss[j]==s[i]) c2++;
		if(c2<c1)	//分别对s和ss中s[i]出现的次数计数,只要c2<c1,就还可以使用s[i]放入ss中
		{
			ss[cur]=s[i];
			print_permutation(cur+1,len);
		}
	}
}

int main()
{
	cin >> N;
	while(N--)
	{
		cin >> s;
		int len = strlen(s);
		qsort(s,len,sizeof(char),cmp);	//按字典序对s排序
		print_permutation(0,strlen(s));
		cout << endl;
	}
	return 0;
}


原文地址:https://www.cnblogs.com/aukle/p/3228740.html