编程珠玑——变位词
2012-01-10 10:58
155 查看
以下两段文字摘自《编程珠玑》:
给定一个英语字典,找出其中的所有变位词集合。例如,“pots”、“stop”和“tops”互为变位词,因为每一个单词都可以通过改变其他单词中字母的顺序来得到。
我们获得的”啊哈!灵机一动“就是标识字典中的每一个词,使得在相同变位词类中的单词具有相同的标识。然后,将所有具有相同标识的单词集中在一起。这将原始的变位词问题简化为两个子问题:选择标识和集中具有相同标识的单词。 对第一个问题,我们可以使用基于排序的标识:将单词中的字母按照字母表顺序排列。要解决第二个问题,我们将所有的单词按照其标识的顺序排列。
给定一个英语字典,找出其中的所有变位词集合。例如,“pots”、“stop”和“tops”互为变位词,因为每一个单词都可以通过改变其他单词中字母的顺序来得到。
我们获得的”啊哈!灵机一动“就是标识字典中的每一个词,使得在相同变位词类中的单词具有相同的标识。然后,将所有具有相同标识的单词集中在一起。这将原始的变位词问题简化为两个子问题:选择标识和集中具有相同标识的单词。 对第一个问题,我们可以使用基于排序的标识:将单词中的字母按照字母表顺序排列。要解决第二个问题,我们将所有的单词按照其标识的顺序排列。
#pragma warning(disable: 4786) #include <iostream> #include <map> #include <string> #include <fstream> using namespace std; int compare_string(const void *a,const void *b) { return *((char*)(a)) - *((char*)(b)); } void FindAnagram(char *file_name) { ifstream in_file(file_name); string word_sort; string word; multimap<string,string> word_map; while(in_file>>word) { word_sort = word; qsort(word_sort.begin(),word_sort.length(),sizeof(char),compare_string); word_map.insert(make_pair(word_sort,word)); } multimap<string,string>::const_iterator iter = word_map.begin(); multimap<string,string>::const_iterator iter_end = word_map.end(); while(iter_end != iter) { cout<<iter->first<<":"<<iter->second<<endl; ++iter; } } int main() { FindAnagram("word.txt"); //文件格式: // pets // step // teps // opt // pot // top // ha // tye // yet return 0; }
相关文章推荐
- 《编程珠玑》第二章2.8 变位词 思路
- 编程珠玑:变位词程序的实现
- 编程珠玑中关于一个单词的所有变位词的解决
- 编程珠玑之第二章questionC: 求变位词问题
- “《编程珠玑》(第2版)第2章”:C题(查找变位词,排序)
- 变位词实现 编程珠玑一处错误
- 变位词实现 编程珠玑一处错误
- 编程珠玑第二章变位词1
- 编程珠玑(五):寻找变位词
- 《编程珠玑》学习总结2-变位词
- 【编程珠玑】学习笔记[2]——变位词
- 编程珠玑:变位词程序的实现
- 编程珠玑
- FZU 1410 变位词
- 【读后感】编程珠玑(第二版)第七章
- 《编程珠玑》第一章-位图排序
- 变位词问题
- 编程珠玑3-5
- C语言实现检查单词是否为变位词(相同字母的重新排列)
- 《编程珠玑》读书笔记 part3