720. 词典中最长的单词

>720. 词典中最长的单词<

>longestWord<

题目描述

定义「符合要求的单词」如下:

▶空字符串是符合要求的单词;

▶在符合要求的单词的末尾添加一个字母,得到的新单词是符合要求的单词。

字典序:即是英文字母表的顺序

Arrays.sort()方法

根据指定比较器产生的顺序对指定对象数组进行排序。数组中的所有元素都必须是通过指定比较器可相互比较的(也就是说,对于数组中的任何 e1e2 元素而言,c.compare(e1, e2) 不得抛出 ClassCastException)。

public static <T> void sort(T[] a,Comparator<? super T> c)

对一维数组进行排序

直接使用 Arrays.sort(arr),默认是升序排序。

对二维数组进行排序

  1. 按照 arr 数组中的每一行的第一列进行比较,并按照升序排序。
 		Arrays.sort(arr, (a, b) -> a[0] - b[0]);

Photo

  1. 按照 arr 数组中的每一行的第一列进行比较,并按照降序排序。
        Arrays.sort(arr, (a, b) -> b[0] - a[0]);

Photo

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;//返回答案
    }
}

运行结果截图如下:
代码运行结果截图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值