变位词(Anagram)是一种由其他词的字母顺序重新排列而成的词,且每个字母只重复一次;例如carthorse是orchestra的变位词。写一个方法返回全部给定词的任意顺序变位词(包括给定词自身),例如getAllAnagrams(“abba”)应当返回”aabb”, “abab”, “abba”, “baab”, “baba”, “bbaa”。请给出完整代码。
解决方案
20
再供参考:
//qplw.cpp #include <stdio.h> #include <string.h> #include <stdlib.h> int v=0; int w=0; int m;//记录字符串长度 int n;//记录字符串中的字符种类数 char map[256];//记录是哪几种字符 int count[256];//记录每种字符有多少个 int stack[1000];//递归用的栈,并记录当前生成的排列 void Make_Map(char *str) {//统计字符串的相关信息 int s[256]; int i; memset(s,0,sizeof(s)); memset(count,0,sizeof(count)); m=strlen(str); if (w<1 || m<w) w=m; while(*str) { s[*str]++; str++; } n=0; for (i=0;i<256;i++) if (s[i]) { map[n]=i; count[n]=s[i]; n++; } } void Find(int depth) {//递归式回溯法生成全排列 if (depth==w) { int i; for (i=0;i<depth;i++) putchar(map[stack[i]]); putchar("\n"); } else { int i; if (v && depth>0) { for (i=0;i<depth;i++) putchar(map[stack[i]]); putchar("\n"); } for (i=0;i<n;i++) if (count[i]) { stack[depth]=i; count[i]--; Find(depth+1); count[i]++; } } } void main(int argc,char**argv) { if (argc<2) { printf("%s 要产生全排列的字符串 [限定长度|-1]\n",argv[0]); return; } if (argc>=3) w=atoi(argv[2]); if (-1==w) v=1; Make_Map(argv[1]); Find(0); } //C:\test>qplw //qplw 要产生全排列的字符串 [限定长度|-1] // //C:\test>qplw 123 //123 //132 //213 //231 //312 //321 // //C:\test>qplw 123 2 //12 //13 //21 //23 //31 //32 // //C:\test>qplw 122333 3 //122 //123 //132 //133 //212 //213 //221 //223 //231 //232 //233 //312 //313 //321 //322 //323 //331 //332 //333 // //C:\test>qplw 123 -1 //1 //12 //123 //13 //132 //2 //21 //213 //23 //231 //3 //31 //312 //32 //321 //