寻找变位词
2014-10-14 14:18
162 查看
转自编程珠玑(五):寻找变位词
今天的问题是关于变位词的,首先来看问题的描述:
给定一本英语单词词典,请找出所有的变位词集。
所谓的变位词是指,组成各个单词的字母完全相同,只是字母排列的顺序不同。
比如,pots、stop、tops就是变位词。
思路一
对组成单词的字母进行组合,针对每一个组合结果在字典中进行匹配。
不足:组合的结果太多,存在很多无效的组合。
思路二
针对每个单词和字典中其他的单词进行比较:先比较单词的长度,长度相同后比较组成字母是否相同。
不足:比较的次数还是太多。
书中的思路
对每个单词进行签名(以字母顺序进行排序),这样变位词将具有相同的签名。输出签名相同的单词,就得到了要求的变位词。
将变位词程序组织成三段式的“管道”结构,前一个程序的输出文件将是下一个程序的输入文件。三段程序如下:
sign:读入字典文件,对单词进行“签名”操作
sort:输入签名后的单词文件,对文件进行排序
squash:将同一个变位词类中的各个单词放到同一行中
下面是对具有六个单词的词典进行操作的流程:
pans anps pans anps pans
pots opst pots anps snap pans snap
opt --》 签名 --》 opt opt --》 排序 --》 opt opt --》挤压 --》 opt
snap anps snap opst pots pots stop tops
stop opst stop opst stop
tops opst tops opst tops
sign程序
代码如下:
sort程序
排序程序直接使用系统的sort程序。
squash程序
挤压程序代码如下:
将以上程序编译成可执行程序后,放到同一目录下(同时将测试测试字典文件拷贝到该目录)。
命令行下(windows下,运行cmd)执行如下命令运行程序:
sign < dictionary | sort | squash >gramlist.txt
我在网上找了一个一万五千个的单词文件,放在这里供测试:dictionary
1.问题描述
今天的问题是关于变位词的,首先来看问题的描述:给定一本英语单词词典,请找出所有的变位词集。
所谓的变位词是指,组成各个单词的字母完全相同,只是字母排列的顺序不同。
比如,pots、stop、tops就是变位词。
2.解决思路
思路一对组成单词的字母进行组合,针对每一个组合结果在字典中进行匹配。
不足:组合的结果太多,存在很多无效的组合。
思路二
针对每个单词和字典中其他的单词进行比较:先比较单词的长度,长度相同后比较组成字母是否相同。
不足:比较的次数还是太多。
书中的思路
对每个单词进行签名(以字母顺序进行排序),这样变位词将具有相同的签名。输出签名相同的单词,就得到了要求的变位词。
3.实现思路
将变位词程序组织成三段式的“管道”结构,前一个程序的输出文件将是下一个程序的输入文件。三段程序如下:sign:读入字典文件,对单词进行“签名”操作
sort:输入签名后的单词文件,对文件进行排序
squash:将同一个变位词类中的各个单词放到同一行中
下面是对具有六个单词的词典进行操作的流程:
pans anps pans anps pans
pots opst pots anps snap pans snap
opt --》 签名 --》 opt opt --》 排序 --》 opt opt --》挤压 --》 opt
snap anps snap opst pots pots stop tops
stop opst stop opst stop
tops opst tops opst tops
4.代码实现
sign程序代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define WORDMAX 100 int charcomp(const void *x, const void *y) { return *(char *)x - *(char *)y; } int main() { char word[WORDMAX], sig[WORDMAX]; while (scanf("%s", word) != EOF) { strcpy(sig, word); qsort(sig, strlen(sig), sizeof(char), charcomp); printf("%s %s\n", sig, word); } return 0; }
sort程序
排序程序直接使用系统的sort程序。
squash程序
挤压程序代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> #define WORDMAX 100 int main() { char word[WORDMAX], sig[WORDMAX], oldsig[WORDMAX]; int linenum = 0; strcpy(oldsig, ""); while (scanf("%s %s", sig, word) != EOF) { if (strcmp(oldsig, sig) != 0 && linenum > 0) printf("\n"); strcpy(oldsig, sig); linenum++; printf("%s ", word); } printf("\n"); return 0; }
5.代码运行
将以上程序编译成可执行程序后,放到同一目录下(同时将测试测试字典文件拷贝到该目录)。命令行下(windows下,运行cmd)执行如下命令运行程序:
sign < dictionary | sort | squash >gramlist.txt
我在网上找了一个一万五千个的单词文件,放在这里供测试:dictionary
相关文章推荐
- 寻找变位词
- 编程珠玑(五):寻找变位词
- 寻找带环的单链表的换的入口位置处的节点
- 从哪里寻找问题的答案之OC4J
- HDOJ,数论简单入门题目,杭电1262,寻找素数对
- 三叉树生成及寻找两个节点的最近路径
- Scala:在性能与开发效率中寻找平衡
- swustoj(变位词(0549))
- 门 - 寻找一个C编译器
- 测试小故事24:寻找需求的真相
- homework-02,第二次作业——寻找矩阵最大子序列和
- [牛客]寻找奇数出现II练习题
- 寻找Bug记(一)
- Linux运维学习之应届生寻找工作
- 九度 寻找大富翁
- Arduino 快速 寻找设备的I2C地址
- 在图上寻找无重边的路
- 二叉树8:寻找错误结点练习题
- (DS1.5.8)POJ 1338 Ugly Numbers(寻找因子只含有2||3||5的数)
- 后缀树应用之寻找重复出现过的最长子串