720. 词典中最长的单词
>720. 词典中最长的单词<
>longestWord<
定义「符合要求的单词」如下:
▶空字符串是符合要求的单词;
▶在符合要求的单词的末尾添加一个字母,得到的新单词是符合要求的单词。
字典序
:即是英文字母表的顺序
Arrays.sort()
方法
根据指定比较器产生的顺序对指定对象数组进行排序。数组中的所有元素都必须是通过指定比较器可相互比较的(也就是说,对于数组中的任何
e1
和e2
元素而言,c.compare(e1, e2)
不得抛出ClassCastException
)。
public static <T> void sort(T[] a,Comparator<? super T> c)
对一维数组进行排序
直接使用 Arrays.sort(arr)
,默认是升序排序。
对二维数组进行排序
- 按照
arr
数组中的每一行的第一列进行比较,并按照升序排序。
Arrays.sort(arr, (a, b) -> a[0] - b[0]);
- 按照
arr
数组中的每一行的第一列进行比较,并按照降序排序。
Arrays.sort(arr, (a, b) -> b[0] - a[0]);
substring()
方法
public String substring(int beginIndex,int endIndex)"hamburger".substring(4, 8) returns "urge" "smiles".substring(1, 5) returns "mile"
返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的
beginIndex
处开始,直到索引endIndex - 1
处的字符。因此,该子字符串的长度为endIndex-beginIndex
。
▶参数简介:
beginIndex
- 起始索引(包括
)。
endIndex
- 结束索引(不包括
)。
一、解题思路
1、解法一( Java )
解法思路:HashSet哈希集合
这道题要求返回数组中的最长的符合要求的单词,如果有多个最长的符合要求的单词则返回其中字典序
最小的单词。
需要将数组 words
排序,排序的规则是首先按照单词的长度升序排序,如果单词的长度相同则按照字典序降序排序。排序之后,可以确保当遍历到每个单词时,比该单词短的全部单词都已经遍历过,且每次遇到符合要求的单词一定是最长且字典序最小的单词,可以直接更新答案。
将答案初始化为空字符串。使用哈希集合存储所有符合要求的单词,初始时将空字符串加入哈希集合。遍历数组 words
,对于每个单词,判断当前单词去掉最后一个字母之后的前缀是否在哈希集合中,如果该前缀在哈希集合中则当前单词是符合要求的单词,将当前单词加入哈希集合,并将答案更新为当前单词。
遍历结束之后,返回答案。
伪代码如下:
class Solution { public String longestWord(String[] words) { Arrays.sort(words, (a, b) -> { if (a.length() != b.length()) { return a.length() - b.length(); } else { return b.compareTo(a); } }); String res = ""; Set<String> set = new HashSet<String>(); set.add(""); int len = words.length; for (int i = 0; i < len; i++) { String word = words[i]; if (set.contains(word.substring(0, word.length() - 1))) { set.add(word); res = word; } } return res; }}
完整代码如下:
package daily_leetcode;import java.util.Arrays;import java.util.HashSet;import java.util.Set;/** * @author Listen 1024 * @date 2022-03-17 9:58 */public class 词典中最长的单词_720 { public static void main(String[] args) { String[] strings = new String[]{"a", "banana", "app", "appl", "ap", "apply", "apple"}; Solution index = new Solution(); String resString = index.longestWord(strings); System.out.println(resString); }}class Solution { public String longestWord(String[] words) { Arrays.sort(words, (a, b) -> { if (a.length() != b.length()) { return a.length() - b.length();//按照单词的长度升序排序(返回值大于0时b在前a在后,返回值小于0时a在前b在后) } else { return b.compareTo(a);//单词的长度相同时则按照字典序降序排序(返回值大于0时b在前a在后,返回值小于0时a在前b在后) } }); String res = "";//将答案初始化为空字符串 Set<String> set = new HashSet<String>();//使用哈希集合存储所有符合要求的单词 set.add("");//初始时将空字符串加入哈希集合 int len = words.length; for (int i = 0; i < len; i++) { String word = words[i]; if (set.contains(word.substring(0, word.length() - 1))) {//判断当前单词去掉最后一个字母之后的前缀是否在哈希集合中 set.add(word);//如果该前缀在哈希集合中则当前单词是符合要求的单词,将当前单词加入哈希集合,并将答案更新为当前单词。 res = word; } } return res;//返回答案 }}
运行结果截图如下: