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;

}


 

 

你可能感兴趣的:(uva)