题目描述:给定一个英语字典,找出其中的所有变位词集合。例如,“pots”、“stop”、“tops”互为变位词,因为每一个单词都可以通过改变其他单词中的字母的顺序来得到。
程序主要有三部分组成,sign、sort和squash。我们用下图来说明(假设要处理的单词有六个pans pots opt snap stop tops),处理结果如下:
可见sign是将单词进行排序(将pans排成anps,按照字母序),sort是对排好序的所有单词再进行一次排序,程序代码如下:
#include<stdio.h> #include<stdlib.h> #include<algorithm> #define MAXWORDNUM 100000 #define MAXWORDLEN 100 using namespace std; struct word_all{ char word[MAXWORDLEN]; char sig[MAXWORDLEN]; }; word_all all[100000]; bool cmp(word_all a,word_all b){ if(strcmp(a.sig,b.sig)<0) return 1; return 0; } int main(){ int num=0; while(scanf("%s",all[num].word)!=EOF){ strcpy(all[num].sig,all[num].word); sort(all[num].sig,all[num].sig+strlen(all[num].sig)); num++; } sort(all,all+num,cmp); //打印经过处理过的数据 //for(int i=0;i<num;i++){ // printf("%s %s\n",all[i].sig,all[i].word); //} //输出 int linenum=0; char oldsig[MAXWORDLEN]; strcpy(oldsig,""); for(int j=0;j<num;j++){ if(strcmp(oldsig,all[j].sig)!=0&&linenum>0) printf("\n"); strcpy(oldsig,all[j].sig); linenum++; printf("%s ",all[j].word); } return 0; }输出结果为:
一个小插曲:编程珠玑上写的比较单词大小的函数int charcomp(char *x,char *y){return *x - *y};
这种函数应用到sort最后一个参数中是不行的,第一点:首先因为数组是char类型的,应该使用char x,char y;
第二点:由于最后一个比较函数是bool类型的,x-y比如说x=3,y=4,不管x-y还是y-x返回都不等于零,返回的为true,所以是不能作为比较条件的。应该改为 return x<y。