【Practice】对一个词典处理,找出拼写含有相同字母的单词如stop和spot

从网易公开课《抽象编程》中看到的,觉得好玩儿写来玩玩。

题目要求:对一个词典的单词进行处理,找出拼写含有相同字母的单词。

方法:把每个单词拼写排好序,形成signature,作为map的key值,map的value是一个set<string>集合,这样就把文件中形同的单词考虑到了,因为set的原因。

利用混合数据结构:map<string,set<string> >

数据来源:http://introcs.cs.princeton.edu/java/data/ 里面的1000word.txt或者worldlist.txt都行

/************************************************************************/
/* 程序实现对一个文件中的所有单词进行处理,找出含有相同字母组合的单词。其实应当对一个大的单词表进行处理。
用处暂时没有,就是觉得好玩。网易公开课抽象编程中看到的。
1.分析出每个单词是要排序的,这样才能标识出这个字母组合
2.其实对处理一个字典的单词表比较有意义
3.数据用的《算法4》网站上的数据,wordlist,2MB的一个文件
*/
/************************************************************************/
#include<iostream>
#include<fstream>
#include<string>
#include<set>
#include<map>
#include<algorithm>
using namespace std;
#include<ctime>
string signature(string str)
{//冒泡排序形成signature,与下面的二选一
	char chr;
	for(unsigned i=0;i<str.length();i++)
		for(unsigned j=i+1;j<str.length();j++)
			if(str[i]>str[j])
			{
				chr = str[i];
				str[i]=str[j];
				str[j]=chr;
			}
	return str;				
}
string signature_alg(string str)
{/用stl算法里的sort函数形成signature,与上面的二选一
	sort(str.begin(),str.end(),std::greater<char>());
	return str;
}
int main()
{
	string filename;
	string word;
	string word_signature;
	ifstream fin;
	cout<<"Please input the file path"<<endl;
	cin>>filename;
	fin.open(filename.c_str());
	if(fin.bad())
	{
		cout<<"can't open the file"<<endl;
	}
	map<string,set<string> > m;
	fin>>word;
	
	clock_t t=clock();
	while(fin.good())
	{
		m[signature(word)].insert(word);
		fin>>word;
	}
	for(auto iter = m.begin();iter!=m.end();iter++)
	{
	cout<<(*iter).first<<"\t";
	for(auto set_iter = iter->second.begin();set_iter!=iter->second.end();set_iter++)
	cout<<*set_iter<<"\t";
	cout<<endl;

	}
	cout<<"所用的时间是"<<clock()-t<<endl;
	fin.close();
	return 0;
};



你可能感兴趣的:(C++,C++,STL,STL)