以下两段文字摘自《编程珠玑》:
给定一个英语字典,找出其中的所有变位词集合。例如,“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; }