leetcode-词典中最长的单词

167 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

题目描述

给出一个字符串数组 words 组成的一本英语词典。返回 words 中最长的一个单词,该单词是由 words 词典中其他单词逐步添加一个字母组成。
若其中有多个可行的答案,则返回答案中字典序最小的单词。若无答案,则返回空字符串。

思路

看了别了的题解,才学了字典树的方法,不过自己的简易思路也能AC过,记录一下。
我的方法是,遍历words,对里面每一个word,记当前已经遍历过且满足条件的字符串为ans,看是否比现在的ans的长度长或者长度一致但字典序更小:如果不是,可以跳过,因为即使它本身满足条件,也不是长度最长或者字典序最小的;如果是,那么就看这个word是否满足条件,记word的长度为len,我们要做的是判断从长度1到长度len-1,是否都包含在words里面(由于长度len对应的就是word本身,肯定已经在words里面了)。那么如何快速判断这len-1个字符串是否都包含在words里面呢?可以把words中的字符串预先都存放到一个set里面,这样查询某个字符串是否存在的时间复杂度就是O(1),常数级别的耗时。这样下来,方法的整体时间复杂度就是o(n*len),n代表字符串的数量,len是字符串的平均长度。

Java版本代码

class Solution {
    public String longestWord(String[] words) {
        Set<String> set = new HashSet<>();
        for (String word : words) {
            set.add(word);
        }
        String longestString = "";
        int longest = 0;
        for (String word : words) {
            int len = word.length();
            if (len < longest) {
                continue;
            }
            if (len == longest && word.compareTo(longestString) > 0) {
                continue;
            }
            boolean flag = true;
            for (int end = len-1; end >= 1; end--) {
                if (!set.contains(word.substring(0, end))) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                longestString = word;
                longest = len;
            }
        }
        return longestString;
    }
}