其他分享
首页 > 其他分享> > UVA195 Anagram 题解

UVA195 Anagram 题解

作者:互联网

To 题目

主要思路:全排列 + 亿点点小技巧。

不会全排列的可以先把这道题过了 P1706

这道题的难点就在于有重复的单词,只记一次。

第一个想法是将所有以生成的单词记录下来,然后每次判断是否为已存在,但是很明显,你不是 TLE 就是 MLE 有哪位勇士去试一下吗

所以,要换一种做法,记录原单词每个字母出现的次数

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n;//共输入n组数据
char s[9999999];//单词
int len;//长度
int used[9999999];//每个字母出现次数
char a[9999999];//原单词
void dfs(int x){
	if(x>len){//如果长度已足
		for(int i=1;i<=len;i++){
			printf("%c",s[i]);//输出
		}
		printf("\n");//换行
		return;//结束函数
	}
	for(int i='A';i<='Z';i++){//枚举字母,不用小写是因为在ASCII码中小写大于大写
		if(used[i]){//如果大写字母可以用
			used[i]--;//减少一次使用次数
			s[x]=i;//此位为i
			dfs(x+1);//确定下一位
			used[i]++;//回溯释放状态
		}
		if(used[i-'A'+'a']){//如果小写字母可以用
			used[i-'A'+'a']--;//减少一次使用次数
			s[x]=i-'A'+'a';//此位为i的小写
			dfs(x+1);//确定下一位
			used[i-'A'+'a']++;//回溯释放状态
		}
	}
}
int main(){
	scanf("%d",&n);//输入n
	while(n--){
		memset(used,0,sizeof(used));//记得初始化
		cin>>a;//输入这个单词
		len=strlen(a);//单词长度
		for(int i=0;i<=len;i++){
			used[a[i]]++;//记录每个字母的可使用次数
		}
		dfs(1);//开始全排列
	}
	return 0;//完结撒花
}

标签:char,int,题解,len,单词,Anagram,include,9999999,UVA195
来源: https://www.cnblogs.com/Mr-Lin-081122/p/16246995.html