您的位置:首页 > 编程语言

编程珠玑——变位词

2012-01-10 10:58 155 查看
以下两段文字摘自《编程珠玑》:

给定一个英语字典,找出其中的所有变位词集合。例如,“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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: