早上好,我来了——刷题PK赛来了,各位加油!
给出一个字符串数组 words 组成的一本英语词典。返回 words 中最长的一个单词,该单词是由 words 词典中其他单词逐步添加一个字母组成。
若其中有多个可行的答案,则返回答案中字典序最小的单词。若无答案,则返回空字符串。
示例 1:
输入:words = [“w”,“wo”,“wor”,“worl”, “world”]
输出:“world”
解释: 单词"world"可由"w", “wo”, “wor”, 和 "worl"逐步添加一个字母组成。
示例 2:
输入:words = [“a”, “banana”, “app”, “appl”, “ap”, “apply”, “apple”]
输出:“apple”
解释:“apply” 和 “apple” 都能由词典中的单词组成。但是 “apple” 的字典序小于 “apply”
题目很简单,对数组中每个单词进行遍历,判断就行,可能效率也还行。或者直接字典树,放字典树代码吧
class Trie {
public:
Trie() {
this->children = vector<Trie *>(26, nullptr);
this->isEnd = false;
}
bool insert(const string & word) {
Trie * node = this;
for (const auto & ch : word) {
int index = ch - 'a';
if (node->children[index] == nullptr) {
node->children[index] = new Trie();
}
node = node->children[index];
}
node->isEnd = true;
return true;
}
bool search(const string & word) {
Trie * 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;
}
private:
vector<Trie *> children;
bool isEnd;
};
class Solution {
public:
string longestWord(vector<string>& words) {
Trie trie;
for (const auto & word : words) {
trie.insert(word);
}
string longest = "";
for (const auto & word : words) {
if (trie.search(word)) {
if (word.size() > longest.size() || (word.size() == longest.size() && word < longest)) {
longest = word;
}
}
}
return longest;
}
};