leetcode-524. 通过删除字母匹配到字典里最长单词

题目

  1. 通过删除字母匹配到字典里最长单词

给你一个字符串 s 和一个字符串数组 dictionary 作为字典,找出并返回字典中最长的字符串,该字符串可以通过删除 s 中的某些字符得到。
如果答案不止一个,返回长度最长且字典序最小的字符串。如果答案不存在,则返回空字符串。
示例 1:
输入:s = “abpcplea”, dictionary = [“ale”,“apple”,“monkey”,“plea”]
输出:“apple”
示例 2:
输入:s = “abpcplea”, dictionary = [“a”,“b”,“c”]
输出:“a”
提示:
1 <= s.length <= 1000
1 <= dictionary.length <= 1000
1 <= dictionary[i].length <= 1000
s 和 dictionary[i] 仅由小写英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-word-in-dictionary-through-deleting
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析

首先明确题目要求的是一个字符串列表里面满足条件的一个字符串(不存在,则返回空串),且有顺序

  • 有顺序
    为了方便起见,一般会对所要查询的列表做排序处理,这里可以用 Java 自带的 sort 函数。

  • 有条件
    这里的条件是 dictionary 中的某些字符串要为 s 的子序列,所以原题目的难点就是如何判断子序列了,这里采用双指针的方法进行判断,具体算法见代码。

实现

class Solution {
    public String findLongestWord(String s, List<String> dictionary) {
        // 字符串按长度降序,按字典升序
        dictionary.sort((str1, str2) -> {
            if (str1.length() != str2.length()) {
                return str2.length() - str1.length();
            } else {
                return str1.compareTo(str2);
            }
        });

        // 判断
        for (String t : dictionary) {
            if (isSubsequence(t, s)) {
                return t;
            }
        }

        return "";
    }

    // 判断 t 是否 为 s 子序列
    public boolean isSubsequence(String t, String s) {
        int i = 0, j = 0;

        while (i < t.length() && j < s.length()) {
            if (t.charAt(i) == s.charAt(j)) {
                i++;
            }
            j++;
        }

        return i == t.length();
    }
}

请添加图片描述
20210914

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值