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 ofwords
will be in the range
[1, 1000]
.The length of
words[i]
will be in the range
[1, 30]
.
用Trie, 先构建出Trie, 在Trie中每个node添加俩个属性,一个是判断是否是一个完整单词,另外一个储存这个单词String这样后期可以直接得到String。
class Solution {
class TireNode{
public TireNode[] children;
public boolean isWord;
public String word;
public TireNode(){
children = new TireNode[26];
isWord = false;
word = null;
}
}
public TireNode tireBuilder(String[] words){
TireNode root = new TireNode();
for(String w : words){
TireNode input = root;
for(char cur : w.toCharArray()){
int index = cur - 'a';
if(input.children[index] == null){
input.children[index] = new TireNode();
}
input = input.children[index];
}
input.isWord = true;
input.word = w;
}
return root;
}
public String longestWord(String[] words) {
String result = "";
TireNode root = this.tireBuilder(words);
for(String word : words){
TireNode curNode = root;
String temp = "";
for(char c : word.toCharArray()){
if(!curNode.children[c-'a'].isWord){
break;
}
else{
curNode = curNode.children[c-'a'];
temp = curNode.word;
}
}
if(result.length() < temp.length()){
result = temp;
}
else{
if(result.length() == temp.length()){
int compare = result.compareTo(temp);
result = compare>0?temp:result;
}
}
}
return result;
}
}