题目描述:给定一个英语字典,找出其中的所有变位词集合。例如,“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。