https://leetcode-cn.com/problems/longest-word-in-dictionary/
给出一个字符串数组words组成的一本英语词典。从中找出最长的一个单词,该单词是由words词典中其他单词逐步添加一个字母组成。若其中有多个可行的答案,则返回答案中字典序最小的单词。
若无答案,则返回空字符串。
解答:
1. 先建立字典树,字典树建立时,同一个父节点下,根据字母的assic 码判断子节点字母先后顺序。
2. js 字符使用charCodeAt() 获取字符assic码
3. 查询字典树时,直接跳过非单词节点,注意审查题目
var longestWord = function(words) {
const treeNode = {
letter:"",
isWord:false,
acssi:undefined,
children:[]
};
const createTree = (letters, treeNode, layer, originWord) => {
const isWord = letters.length === 1;
const curletter = letters.shift();
let targetNode = treeNode.children.find(child => child.letter === curletter);
if(targetNode){
if(isWord){
targetNode.isWord = isWord;
targetNode.word = originWord;
}
}else{
targetNode = {
letter:curletter,
isWord:isWord,
layer:layer,
word: isWord ? originWord:"",
acssi: curletter.charCodeAt(),
children:[]
}
let index = treeNode.children.findIndex(child => child.acssi > targetNode.acssi );
if(index === -1) index = treeNode.children.length; // 需要特别注意 -1 的case
treeNode.children.splice(index,0,targetNode);
}
if(!isWord){
createTree(letters, targetNode, layer+1, originWord)
}
}
// create dictTree
words.forEach( word => createTree(word.split(""),treeNode, 1, word));
// search
let longestWordinfo = {
word:"",
layer:0
}
search = treeNode => {
if(treeNode.layer > longestWordinfo.layer)
{
longestWordinfo={
word: treeNode.word,
layer: treeNode.layer,
}
}
treeNode.children.forEach(child =>{
child.isWord && search(child)
})
}
search(treeNode);
return longestWordinfo.word;
};