词典中最长的单词

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;

};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值