#720 Longest Word in Dictionary

Description

Given an array of strings words representing an English Dictionary, return 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. If there is no answer, return the empty string.

Examples

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”.

Constraints:

1 <= words.length <= 1000
1 <= words[i].length <= 30
words[i] consists of lowercase English letters.

思路

同样是因为有目的性的刷题,所以提前知道了这题要用前缀树
题目要求找到可以组成的最长的单词
所以第一步是要对列表里的word进行排序,这里给出的要求是如果两个字符串长度一样,要给出lexicographically smaller的那个,所以排序的逻辑如下

public int compare(String o1, String o2) {
    if(o1.length() == o2.length()){
        return o1.compareTo(o2);
    }else{
        return o1.length() - o2.length();
    }
}

排序完之后,一个一个轮流进入前缀树就可以了,一个长度为n的单词,如果 substring[0, n - 1] 是前缀树中存在的单词,那么这个单词就被放入前缀树,如果这个单词长于之前被记录的“temp_最长单词”,那么它将代替原来的,被记为新的“temp_最长单词”,一直执行到最后一个,返回最终的"temp_最长单词"即可。

代码

class TreeNode {
    public TreeNode[] children = new TreeNode[26];
    public TreeNode(){
        for(TreeNode child: children){
            child = null;
        }
    }
    
    public void addChild(int num){
        children[num] = new TreeNode();
    }
    
    public boolean contains(int num){
        return children[num] != null;
    }
}
class Solution {
    public String longestWord(String[] words) {
        String answer = "";
        Arrays.sort(words, new Comparator<String>() {
                @Override
                public int compare(String o1, String o2) {
                    if(o1.length() == o2.length()){
                        return o1.compareTo(o2);
                    }else{
                        return o1.length() - o2.length();
                    }
                }
            });
        
        TreeNode root = new TreeNode();
        for(String word: words){
            TreeNode node = root;
            int i;
            for(i = 0; i < word.length() - 1; i++){
                char currentChar = word.charAt(i);
                if(!node.contains(currentChar - 'a'))
                    break;
                node = node.children[currentChar - 'a'];
            }
            if(i != word.length() - 1)
                continue;
            node.addChild(word.charAt(i) - 'a');
            if (answer.length() < word.length()){
                answer = word;
            }
        }
        return answer;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值