Leetcode Index

720.Longest Word in Dictionary

720.Longest Word in Dictionary

难度:Easy

给出一个字符串数组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"。
注意:
所有输入的字符串都只包含小写字母。
words数组长度范围为[1,1000]。
words[i]的长度范围为[1,30]。

可以先按照所需要的順序,即字符串長度進行排序,然後從前往後判斷是否是有效字符串。 由於前面的肯定比後面的長,因此在前面判斷的時候,可以借鑑斐波那契數列的方法,用一個set將中間結果存起來,後面的可以直接查詢該set。

class Solution {
unordered_set<string>isChecked;
bool isValid(string s, unordered_set<string>word)
{
if(isChecked.count(s)) return true;
string res;
for(auto c:s)
{
res+=c;
if(!word.count(res)) return false;
else isChecked.insert(res);
}
return true;
}
public:
string longestWord(vector<string>& words) {
int len=0;
unordered_set<string>word(words.begin(),words.end());
sort(words.begin(), words.end(), [](string a,string b){if(a.length() > b.length()) return true; else if(a.length() == b.length() && a<b) return true; else return false;});
for(auto w: words)
{
if(isValid(w,word))
{
return w;
}
}
return "";
}
};

执行用时 :264 ms, 在所有 C++ 提交中击败了15.95%的用户 内存消耗 :63.2 MB, 在所有 C++ 提交中击败了5.88%的用户