字典中最长的字符串
题目描述:
给出一个字符串数组 words 组成的一本英语词典。返回 words 中最长的一个单词,该单词是由 words 词典中其他单词逐步添加一个字母组成。
若其中有多个可行的答案,则返回答案中字典序最小的单词。若无答案,则返回空字符串。
示例 1:
输入:words = [“w”,“wo”,“wor”,“worl”, “world”]
输出:“world”
解释: 单词"world"可由"w", “wo”, “wor”, 和 "worl"逐步添加一个字母组成。
示例 2:
输入:words = [“a”, “banana”, “app”, “appl”, “ap”, “apply”, “apple”]
输出:“apple”
解释:“apply” 和 “apple” 都能由词典中的单词组成。但是 “apple” 的字典序小于 “apply”
提示:
1 <= words.length <= 1000
1 <= words[i].length <= 30
所有输入的字符串 words[i] 都只包含小写字母。
思路:
当看到需要找到最长的字符串时,会想起来DFA算法,但是在其中使用了大量的Map集合且内部嵌套Map集合,创建麻烦,DFA算法在创建的时候需要一个字符一个字符的去判断是否存在这个键,这个过程会造成时间浪费,而且复杂度更高,需要多方面考虑,容易出错。
这里采用的是利用Set集合完成,我们将数组按照长度由小到大的顺序进行排列,随后判断比他少一个字符的字符串是否存在,如果存在,那么这个字符串可能就是我们需要查找的最长的字符串,也可能只是一个中间值,因此在这里需要进行记录最大的长度以及最大字符串的值。
代码
class Solution {
public String longestWord(String[] words) {
Set<String> set =new HashSet<>();
//重新定义排列方式: 根据字符串长度进行排列,
Arrays.sort(words,(a,b)->{
if(a.length()!=b.length()){
return a.length()-b.length();
}else{
return b.compareTo(a);
}
});
//添加一个 "" 是因为当字符串的长度为1的时候,比他少一个字符的只能是"",否则无法加入
//也可以进行优化,如果长度为1直接放入到set集合
set.add("");
String longestWord="";
for(int i =0;i< words.length;i++){
String word= words[i];
// 判断比他少一位的字符串是否存在,存在就放进去
if(set.contains(word.substring(0,word.length()-1))){
set.add(word);
//在这里不记录最大长度是因为我们在开始的时候已经排过序了,越往后去字符串长度越长
longestWord=word;
}
}
return longestWord;
}
}