LeetCode 720 词典中最长的单词[排序 set 字典树] HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 720 词典中最长的单词[排序 set 字典树] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
解题思路:
一道并不简单的简单题,最简单的方法哈希集合的方法,首先将所有字符串按照长度由短到长排序,长度相同按照字典序排序,然后按照排序好的顺序进行遍历,如果当前字符串去掉最后一个字母在unordered_set
中,则放入unordered_set
,并记录最长字符串,代码如下:
class Solution
public:
string longestWord(vector<string>& words)
sort(words.begin(), words.end(), [](const string& a, const string& b)
if(a.size() != b.size())
return a.size() < b.size();
else return a > b;
);
string longest;
unordered_set<string> search;
search.insert("");
for(auto& word : words)
if(search.count(word.substr(0, word.size() - 1)))
search.insert(word);
longest = word;
return longest;
;
如果通晓字典树,那么这道题做起来也是易如反掌,首先构建好字典树,接着把所有字符串放入树中,注意在search的时候,一定每一层都有end的子序列,否则不满足其他单词逐步添加一个字母的条件,代码如下:
class Tree
private:
vector<Tree*> children;
bool isEnd;
public:
Tree()
children = vector<Tree*>(26, nullptr);
isEnd = false;
void insert(const string& word)
Tree* node = this;
for(const auto& ch : word)
int index = ch - 'a';
if(node->children[index] == nullptr)
node->children[index] = new Tree();
node = node->children[index];
node->isEnd = true;
bool search(const string& word)
Tree* node = this;
for(const auto& ch : word)
int index = ch - 'a';
// 每一层都要有确定的子序列
if(node->children[index] == nullptr || !node->children[index]->isEnd)
return false;
node = node->children[index];
return node != nullptr && node->isEnd;
;
class Solution
public:
string longestWord(vector<string>& words)
Tree tree;
for(const string& word : words)
tree.insert(word);
string longest;
for(const string& word : words)
if(tree.search(word))
if(word.size() > longest.size() || (word.size() == longest.size() && word < longest))
longest = word;
return longest;
;
以上是关于LeetCode 720 词典中最长的单词[排序 set 字典树] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 432. 全 O 的数据结构(双向链表+哈希表) / 720. 词典中最长的单词 / 2043. 简易银行系统