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;
}
}