给一个词典,找出其中所有最长的单词。 样例
在词典 { "dog", "google", "facebook", "internationalization", "blabla" } 中, 最长的单词集合为 ["internationalization"] 在词典 { "like", "love", "hate", "yes" } 中,最长的单词集合为 ["like", "love", "hate"]
如果只是要最长的一个单词,那么只需要一次遍历即可,这里是要求求出最长单词的集合,稍作改变即可。
首先把第一个单词放入容器res,并把第一个单词的大小记作max_size,然后遍历,如果新来的单词的大小比max_size大,那么清空res,并把新单词放入,并且用当前单词的大小来更新max_size。如果新来的单词的大小和max_size想等,那么把当前单词放入即可,这样一遍遍历就可以达到目的,代码写起来也是非常简单:
vector<string> longestWords(vector<string> &dictionary)
{
vector<string> res;
int max_size=dictionary[0].size();
for(auto d:dictionary)
{
if(d.size()>max_size)
{
max_size=d.size();
res.clear();
res.push_back(d);
}
else if(d.size()==max_size)
{
res.push_back(d);
}
}
return res;
}
我一开始写了一个麻烦的,主要是没想到用vector::clear(),但基本思路是一样的,就是写起来麻烦点,贴在下面,注释齐全:
vector<string> longestWords(vector<string> &dictionary)
{
vector<int> max_index; //记录最大长度的索引
vector<string> res;
int max_size=0; //记录当前最大值
//这次遍历挑了大的出来,越大,排的越靠后,因为只有比当前的最大大,才能插入
for(int i=0;i<dictionary.size();i++)
{
if(dictionary[i].size()>=max_size)
{
max_index.push_back(i);
cout<<*(max_index.end()-1)<<" ";
max_size=dictionary[i].size();
}
}
//如果只有一个的话,肯定这个是最长的,而且应该是第一个
if(max_index.size()==1)
{
res.push_back(dictionary[max_index[0]]);
return res;
}
else
//因为是需要一个集合,所以从后往前把长度相同的都插入到res中
max_size=0; //记得清零,最后一个一定放进去
{
for(auto end=max_index.end()-1;end>=max_index.begin();end--)
{
if(dictionary[*end].size()>=max_size)
{
max_size=dictionary[*end].size();
res.push_back(dictionary[*end]);
}
else break;
}
}
return res;
// write your code here
}
···