现在的位置: 首页 > 综合 > 正文

编程珠玑——变位词

2013年09月05日 ⁄ 综合 ⁄ 共 1027字 ⁄ 字号 评论关闭

以下两段文字摘自《编程珠玑》:

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

抱歉!评论已关闭.