Given an array of strings words
, find the longest string in words
such that every prefix of it is also in words
.
<li>For example, let <code>words = ["a", "app", "ap"]</code>. The string <code>"app"</code> has prefixes <code>"ap"</code> and <code>"a"</code>, all of which are in <code>words</code>.</li>
Return the string described above. If there is more than one string with the same length, return the lexicographically smallest one, and if no string exists, return ""
.
Example 1:
Input: words = ["k","ki","kir","kira", "kiran"] Output: "kiran" Explanation: "kiran" has prefixes "kira", "kir", "ki", and "k", and all of them appear in words.
Example 2:
Input: words = ["a", "banana", "app", "appl", "ap", "apply", "apple"] Output: "apple" Explanation: Both "apple" and "apply" have all their prefixes in words. However, "apple" is lexicographically smaller, so we return that.
Example 3:
Input: words = ["abc", "bc", "ab", "qwe"] Output: ""
Constraints:
<li><code>1 <= words.length <= 10<sup>5</sup></code></li>
<li><code>1 <= words[i].length <= 10<sup>5</sup></code></li>
<li><code>1 <= sum(words[i].length) <= 10<sup>5</sup></code></li>
class Trie:
def __init__(self):
self.children = [None] * 26
self.is_end = False
def insert(self, w):
node = self
for c in w:
idx = ord(c) - ord("a")
if node.children[idx] is None:
node.children[idx] = Trie()
node = node.children[idx]
node.is_end = True
def search(self, w):
node = self
for c in w:
idx = ord(c) - ord("a")
node = node.children[idx]
if not node.is_end:
return False
return True
class Solution:
def longestWord(self, words: List[str]) -> str:
trie = Trie()
for w in words:
trie.insert(w)
ans = ""
for w in words:
if ans and (len(ans) > len(w) or (len(ans) == len(w) and ans < w)):
continue
if trie.search(w):
ans = w
return ans
class Trie {
Trie[] children = new Trie[26];
boolean isEnd;
void insert(String w) {
Trie node = this;
for (char c : w.toCharArray()) {
c -= 'a';
if (node.children[c] == null) {
node.children[c] = new Trie();
}
node = node.children[c];
}
node.isEnd = true;
}
boolean search(String w) {
Trie node = this;
for (char c : w.toCharArray()) {
c -= 'a';
node = node.children[c];
if (!node.isEnd) {
return false;
}
}
return true;
}
}
class Solution {
public String longestWord(String[] words) {
Trie trie = new Trie();
for (String w : words) {
trie.insert(w);
}
String ans = "";
for (String w : words) {
if (!"".equals(ans)
&& (ans.length() > w.length()
|| (ans.length() == w.length() && ans.compareTo(w) < 0))) {
continue;
}
if (trie.search(w)) {
ans = w;
}
}
return ans;
}
}
class Trie {
private:
vector<Trie*> children;
bool isEnd;
public:
Trie()
: children(26)
, isEnd(false) { }
void insert(string word) {
Trie* node = this;
for (char c : word) {
c -= 'a';
if (!node->children[c]) node->children[c] = new Trie();
node = node->children[c];
}
node->isEnd = true;
}
bool search(string word) {
Trie* node = this;
for (char c : word) {
c -= 'a';
node = node->children[c];
if (!node->isEnd) return false;
}
return true;
}
};
class Solution {
public:
string longestWord(vector<string>& words) {
Trie* trie = new Trie();
for (auto w : words) trie->insert(w);
string ans = "";
for (auto w : words) {
if (ans != "" && (ans.size() > w.size() || (ans.size() == w.size() && ans < w))) continue;
if (trie->search(w)) ans = w;
}
return ans;
}
};
type Trie struct {
children [26]*Trie
isEnd bool
}
func newTrie() *Trie {
return &Trie{}
}
func (this *Trie) insert(word string) {
node := this
for _, c := range word {
c -= 'a'
if node.children[c] == nil {
node.children[c] = newTrie()
}
node = node.children[c]
}
node.isEnd = true
}
func (this *Trie) search(word string) bool {
node := this
for _, c := range word {
c -= 'a'
node = node.children[c]
if !node.isEnd {
return false
}
}
return true
}
func longestWord(words []string) string {
trie := newTrie()
for _, w := range words {
trie.insert(w)
}
ans := ""
for _, w := range words {
if ans != "" && (len(ans) > len(w) || (len(ans) == len(w) && ans < w)) {
continue
}
if trie.search(w) {
ans = w
}
}
return ans
}