变位词的相关知识

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

 给定一个英语字典,找出其中的所有变位词集合。例如,“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("f://data.txt");
	return 0;
}


转载于:https://my.oschina.net/xtfggef/blog/56449

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值