720. Longest Word in Dictionary
Given a list of strings words
representing an English Dictionary, find the longest word in words
that can be built one character at a time by other words in words
. If there is more than one possible answer, return the longest word with the smallest lexicographical order.
Example 1:
Input: words = ["w","wo","wor","worl", "world"] Output: "world" Explanation: The word "world" can be built one character at a time by "w", "wo", "wor", and "worl".
Example 2:
Input: words = ["a", "banana", "app", "appl", "ap", "apply", "apple"] Output: "apple" Explanation: Both "apply" and "apple" can be built from other words in the dictionary. However, "apple" is lexicographically smaller than "apply".
Note:
- All the strings in the input will only contain lowercase letters.
- The length of
words
will be in the range[1, 1000]
. - The length of
words[i]
will be in the range[1, 30]
.题目的意思是看word的所有前缀在不在 集合里面。
class TrieNode{
public:
char var;
bool isWord;
TrieNode* children[26];
TrieNode()
{
var = 0;
isWord = false;
memset(children, 0, sizeof(TreeNode*)*26);
}
TrieNode(char c)
{
var = c;
isWord = false;
memset(children, 0, sizeof(TreeNode*)*26);
}
};
static bool compare(string a, string b)
{
if (a.size() == b.size())
{
int k = 0;
while (k < a.size() && k < b.size() && a[k] == b[k])
k++;
return a[k] < b[k];
}
return a.size() > b.size();
}
class Solution {
public:
string longestWord(vector<string>& words)
{
root = new TrieNode();
//构造字典树
for (auto s : words)
{
TrieNode* p = root;
for (int k = 0; k < s.size(); k++)
{
if (p->children[s[k] - 'a'] == 0)
{
TrieNode* pnew = new TrieNode(s[k]);
p->children[s[k] - 'a'] = pnew;
}
p = p->children[s[k] - 'a'];
}
p->isWord = true;
}
vector<string> ret;
int maxretsize = 0; //记录已经得到的ret中最长的
for (auto s : words)
{
if (s.size() < maxretsize) continue;
TrieNode* p = root;
for (int k = 0; k < s.size(); k++)
{
p = p->children[s[k] - 'a'];
if (!p->isWord)
break;
if (k + 1 == s.size()) //最后一位了
{
ret.push_back(s);
maxretsize = s.size();
}
}
}
sort(ret.begin(), ret.end(), compare);
return ret.empty() ? "" : ret[0];
}
private:
TrieNode* root;
};