题目来源:LintCode
原题地址:http://www.lintcode.com/zh-cn/problem/longest-words/
题目:
给一个词典,找出其中所有最长的单词。
您在真实的面试中是否遇到过这个题?
Yes
样例
在词典
{
"dog",
"google",
"facebook",
"internationalization",
"blabla"
}
中, 最长的单词集合为 ["internationalization"]
在词典
{
"like",
"love",
"hate",
"yes"
}
中,最长的单词集合为 ["like", "love", "hate"]
难度级别:
容易
容易
思路分析:
其实如果这个题目采用两次遍历数组的话,就没有什么挑战性,很容易就能解的。
是否能够一次遍历就能够解决这个问题呢?
我想是可以的。
我所采取的手段是借用栈这个数据结构。栈有着先入后出的特点。
字符串是否放入栈中,我所采用的标准是,判断此字符串是否比当前栈中最长的字符串长度要长,如果是则更新这个最长值,并将此字符串放入栈中;
如果是等于,也放入栈中,但是长度不更新;如果是小于则不放入栈中。
根据这个策略进行一次循环之后,很容易就可以看出,此时的栈中最上面的字符串必然是原数组中字符串最长的字符串或者是之一。
因此取出最长的这些字符串就可以得到答案。
是否能够一次遍历就能够解决这个问题呢?
我想是可以的。
我所采取的手段是借用栈这个数据结构。栈有着先入后出的特点。
字符串是否放入栈中,我所采用的标准是,判断此字符串是否比当前栈中最长的字符串长度要长,如果是则更新这个最长值,并将此字符串放入栈中;
如果是等于,也放入栈中,但是长度不更新;如果是小于则不放入栈中。
根据这个策略进行一次循环之后,很容易就可以看出,此时的栈中最上面的字符串必然是原数组中字符串最长的字符串或者是之一。
因此取出最长的这些字符串就可以得到答案。
实现代码:
#include <iostream>
#include <vector>
#include <string>
#include <stack>
using namespace std;
class Solution
{
public:
/**
* @param dictionary: a vector of strings
* @return: a vector of strings
*/
vector<string> longestWords(vector<string> &dictionary)
{
vector<string> result;
if (dictionary.empty())
{
return result;
}
stack<string> strStack;
int maxLen = 0;
for (int i = 0; i < dictionary.size(); i++)
{
if (dictionary[i].size() >= maxLen)
{
strStack.push(dictionary[i]);
maxLen = dictionary[i].size();
}
}
while (!strStack.empty())
{
if (strStack.top().size() == maxLen)
{
result.push_back(strStack.top());
strStack.pop();
} else
{
break;
}
}
return result;
}
};
代码说明:
实现代码中的maxLen是用来存放当前栈中最长字符串的长度值的,初始值为0。
此代码得到的结果,若存在多个字符串长度均为并列最长,此时序列并非与字典序相同,而是恰好相反(这是使用了栈数据结构的原因)。
如果题目有要求,则需要再进行一次翻转操作。
因为本题没有要求,因此我就没有进行此操作。
实现代码中的maxLen是用来存放当前栈中最长字符串的长度值的,初始值为0。
此代码得到的结果,若存在多个字符串长度均为并列最长,此时序列并非与字典序相同,而是恰好相反(这是使用了栈数据结构的原因)。
如果题目有要求,则需要再进行一次翻转操作。
因为本题没有要求,因此我就没有进行此操作。