/*************************************************************************
> File Name: word.cpp
> Author:keson
> Mail:keson@bupt.edu.cn
> Created Time: 2014年11月25日 星期二 12时39分34秒
************************************************************************/
#include<iostream>
#include<vector>
#include<map>
using namespace std;
//Return true if word1 and word2 are the same length.
//and differ in only one character
bool oneCharOff(const string &word1,const string &word2)
{
if(word1.length()!=word2.length())
return false;
int diffs=0;
for(int i=0;i<word1.length();i++)
if(word1[i]!=word2[i])
if(++diffs>1)
return false;
return diffs=1;
}
map<string,vector<string>> computeAdjacentWords(const vector<string> &words)
{
map<string,vector<string>> adjWords;
map<int,vector<string>> wordsByLength;
//Group by their length.
for(int i=0;i<words.size();i++)
{
wordsByLength[words[i].length()].push_back(words[i]);
}
//word on each group separately
map<int,vector<string>>::const_iterator itr;
for(itr=wordsByLength.begin();itr!=wordsByLength.end();++itr)
{
const vector<string> &groupWords=itr->second;
for(int i=0;i<groupWords.size();i++)
for(int j=i+1;j<groupWords.size();j++)
if(oneCharOff(groupWords[i],groupWords[j]))
{
adjWords[groupWords[i]].push_back(groupWords[j]);
adjWords[groupWords[j]].push_back(groupWords[i]);
}
}
return adjWords;
}
//Compute a map in which the keys in words and values are vectors of word
//that differ in only one character from the corresponding key.
//Uses an efficient algorithm that is O(NlogN) with a map
map<string,vector<string>> computeAdjacentWords_2(const vector<string> &words)
{
map<string,vector<string>> adjWords;
map<int,vector<string>> wordsByLength;
for(int i=0;i<words.size();i++)
{
wordsByLength[words[i].length()].push_back(words[i]);
}
for(auto itr= wordsByLength.begin();itr!=wordsByLength.end();++itr)
{
const vector<string> &groupWords=itr->second;
int groupNum=itr->first;
for(int i=0;i<groupNum;i++)
{
map<string,vector<string>> repToWord;
for(int j=0;j<groupWords.size();j++)
{
string rep=groupWords[j];
rep.erase(i,1);
repToWord[rep].push_back(groupWords[j]);
}
for(auto itr2=repToWord.begin();itr2!=repToWord.end();itr2++)
{
const vector<string> &clique=itr2->second;
for(int p=0;p<clique.size();p++)
{
for(int q=p+1;q<clique.size();q++)
{
adjWords[clique[p]].push_back(clique[q]);
adjWords[clique[q]].push_back(clique[p]);
}
}
}
}
}
return adjWords;
}
int main()
{
string s;
vector<string> vec;
while(cin>>s)
vec.push_back(s);
map<string,vector<string>> AdjWords=computeAdjacentWords_2(vec);
for(auto itr=AdjWords.begin();itr!=AdjWords.end();itr++)
{
cout<<itr->first<<" have "<<itr->second.size()<<" items:"<<endl;
for(int i=0;i<itr->second.size();i++)
cout<<itr->second[i]<<" ";
cout<<endl;
}
return 0;
}
map<string,vector<string>>两种字典排序 ——数据结构与算法分析上的
最新推荐文章于 2024-04-09 00:19:25 发布