问题简述:
输出一串字符的全排列,顺序不同于一般的字母序,而是 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[13],ans[13];
int visited[13];
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=0;i<t;i++)
printf("%c",ans[i]);
printf("\n");
return;
}
for(int i=0;i<strlen(str);i++) {
if(!visited[i]) {
ans[t]=str[i];
visited[i]=1;
dfs(t+1);
visited[i]=0;
while(i+1<strlen(str)&&str[i]==str[i+1]) i++;
}
}
}
int main()
{
scanf("%d",&n);
getchar();
while(n--) {
memset(visited,0,sizeof(visited));
gets(str);
sort(str,str+strlen(str),cmp);
dfs(0);
}
return 0;
}
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[13];
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 0;
}