720. 词典中最长的单词
给出一个字符串数组 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] 都只包含小写字母。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-word-in-dictionary
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析
今天的每日一题。
思路比较简单,主要学习字符串的 compareTo(String) 方法:
public int compareTo(String anotherString)
按字典顺序将此 String 对象表示的字符序列与参数字符串所表示的字符序列进行比较。如果按字典顺序此 String 对象位于参数字符串之前,则比较结果为一个负整数。如果按字典顺序此 String 对象位于参数字符串之后,则比较结果为一个正整数。如果这两个字符串相等,则结果为 0 。
例如 a 和 b 的比较:“a”.compareTo(“b”) 因为 a 的字典序小于 b 即 a < b,结果会返回负整数。
题解(Java)
class Solution {
public String longestWord(String[] words) {
Arrays.sort(words, (a, b) -> {
if (a.length() != b.length()) {
return a.length() - b.length();
} else {
// b 的字典序大就选 b,否则选 a,相当于降序排列。
return b.compareTo(a);
}
});
String longest = "";
Set<String> set = new HashSet<String>();
set.add("");
int n = words.length;
for (int i = 0; i < n; i++) {
String word = words[i];
if (set.contains(word.substring(0, word.length() - 1))) {
set.add(word);
longest = word;
}
}
return longest;
}
}