题目:
Given a list of strings words
representing an English Dictionary, find 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.
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".
Note:
- All the strings in the input will only contain lowercase letters.
- The length of
words
will be in the range[1, 1000]
. - The length of
words[i]
will be in the range[1, 30]
.分析1(推荐):class Solution { public String longestWord(String[] words) { //给定字符串数组,找出包含最长的字符串(包含其他单词的字母),如果存在相同长度,取字母排序小的 //思路:对数组排序,再利用Set对字母存储,小的单词一定包含在后面大的单词里面。后面只需要取前缀相同的 Set<String> set=new HashSet<String>(); for(int i=0;i<words.length;i++){ set.add(words[i]); } int length=0; String word=""; for(int i=0;i<words.length;i++){ if(words[i].length()>length||(words[i].length()==length&&words[i].compareTo(word)<0)){ //如果存在相同长度的字符串,取字母排序较小的 int len=words[i].length(); while(len>0&&set.contains(words[i].substring(0,len))){ //求相同的部分 len--; } if(len==0){ //说明该单词的所有字符串均为公共字母,将其标记为匹配串 length=words[i].length(); word=words[i]; } } } return word; } }
分析2:class Solution { public String longestWord(String[] words) { //给定字符串数组,找出包含最长的字符串(包含其他单词的字母),如果存在相同长度,取字母排序小的 //思路:对数组排序,再利用Set对字母存储,小的单词一定包含在后面大的单词里面。后面只需要取前缀相同的 //对字母排序后,第一个单词一定是共有的,后面只需在此基础上添加 Arrays.sort(words); HashSet<String> set=new HashSet<String>(); String res=""; for(String s:words){ //如果单词只有一个字母,那一定是共有的 if(s.length()==1||set.contains(s.substring(0,s.length()-1))){ res=s.length()>res.length()?s:res; set.add(s); } } return res; } }