POJ 1256.Anagram

时间:2023-03-09 06:51:15
POJ 1256.Anagram

2015-06-04

问题简述:

  输出一串字符的全排列,顺序不同于一般的字母序,而是 A<a<B<b......<Z<z。所以应该重写一个比较函数。

  原题链接:http://poj.org/problem?id=1256

解题思路:

  两种方法:

  方法一:简单的深搜 DFS 搜索所有的可能,但是要注意几个连续相同的字符算作一种情况。

  方法二:使用 STL 的 next_permutation 函数可以很方便的生成全排列。

      关于 next_permutation 函数,可以参考:姜南(Slyar)的文章(点击直接跳转) 感谢原作者!

DFS源代码:

  /*
OJ: POJ
ID: 3013216109
TASK: 1256.Anagram
LANG: C++
NOTE: DFS
*/
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std; int n;
char str[],ans[];
int visited[]; bool cmp(char a,char b) {
if(tolower(a)==tolower(b))
return a<b;
else
return tolower(a)<tolower(b);
} void dfs(int t) {
if(t==strlen(str)) {
for(int i=;i<t;i++)
printf("%c",ans[i]);
printf("\n");
return;
}
for(int i=;i<strlen(str);i++) {
if(!visited[i]) {
ans[t]=str[i];
visited[i]=;
dfs(t+);
visited[i]=;
while(i+<strlen(str)&&str[i]==str[i+]) i++;
}
}
} int main()
{
scanf("%d",&n);
getchar();
while(n--) {
memset(visited,,sizeof(visited));
gets(str);
sort(str,str+strlen(str),cmp);
dfs();
}
return ;
}

STL源代码:

  /*
OJ: POJ
ID: 3013216109
TASK: 1256.Anagram
LANG: C++
NOTE: NEXT_PERMUTATION
*/
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std; int n;
char str[]; bool cmp(char a,char b) {
if(tolower(a)==tolower(b))
return a<b;
else
return tolower(a)<tolower(b);
} int main()
{
scanf("%d",&n);
getchar();
while(n--) {
gets(str);
sort(str,str+strlen(str),cmp);
do {
puts(str);
} while(next_permutation(str,str+strlen(str),cmp));
}
return ;
}