当前位置: 首页 > article >正文

24/12/24 力扣每日一题 # LeetCode 524. 通过删除字母匹配到字典里最长单词 全网最详细解释

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

难度:中等
相关标签:字符串、双指针、排序
相关企业:暂无

题目描述

给你一个字符串 s 和一个字符串数组 dictionary,找出并返回 dictionary 中最长的字符串,该字符串可以通过删除 s 中的某些字符得到。

如果答案不止一个,返回长度最长且字母序最小的字符串。如果答案不存在,则返回空字符串。

示例 1

输入:s = "abpcplea", dictionary = ["ale","apple","monkey","plea"]
输出:"apple"
解释:"apple" 可以通过删除 "abpcplea" 中的某些字符得到。

示例 2

输入:s = "abpcplea", dictionary = ["a","b","c"]
输出:"a"

提示

  • 1 <= s.length <= 1000
  • 1 <= dictionary.length <= 1000
  • 1 <= dictionary[i].length <= 1000
  • sdictionary[i] 仅由小写英文字母组成

解题思路

为了找到 dictionary 中最长的字符串,该字符串可以通过删除 s 中的某些字符得到,我们可以采用以下步骤:

  1. 排序字典

    • 首先,我们需要将 dictionary 按照特定的规则进行排序:
      • 主排序关键字:字符串长度,降序
      • 次排序关键字:字符串本身,字母序升序
    • 这样可以确保我们首先检查最长的字符串,如果有多个长度相同的字符串,则按字母序最小的优先。
  2. 检查子序列

    • 对于排序后的每个单词,我们需要检查它是否是字符串 s 的子序列。
    • 使用双指针法,遍历 sdictionary 中的单词,判断单词是否可以通过删除 s 中的某些字符得到。
  3. 返回结果

    • 一旦找到第一个满足条件的单词,即为所需的最长单词,直接返回。
    • 如果遍历完所有单词都没有找到,返回空字符串。

代码实现

以下是根据上述思路实现的 Python 代码:

from typing import List

class Solution:
    def findLongestWord(self, s: str, dictionary: List[str]) -> str:
        # 按长度降序,字母序升序排序
        dictionary.sort(key=lambda x: (-len(x), x))
        
        for word in dictionary:
            if self.is_subsequence(s, word):
                return word
        return ""
    
    def is_subsequence(self, s: str, word: str) -> bool:
        """
        检查 word 是否是 s 的子序列。
        使用双指针法,遍历 s 和 word。
        """
        a, b = 0, 0
        while a < len(s) and b < len(word):
            if s[a] == word[b]:
                b += 1
            a += 1
        return b == len(word)

代码详解

  1. 排序字典

    dictionary.sort(key=lambda x: (-len(x), x))
    
    • 使用 lambda 函数作为排序关键字,返回一个元组 (-len(x), x)
      • -len(x):确保字符串按长度降序排序。
      • x:在长度相同的情况下,按字母序升序排序。
  2. 遍历字典并检查子序列

    for word in dictionary:
        if self.is_subsequence(s, word):
            return word
    return ""
    
    • 遍历排序后的 dictionary,对于每个单词,调用 is_subsequence 方法检查是否为 s 的子序列。
    • 一旦找到符合条件的单词,立即返回该单词。
    • 如果没有找到,返回空字符串。
  3. 子序列检查函数

    def is_subsequence(self, s: str, word: str) -> bool:
        a, b = 0, 0
        while a < len(s) and b < len(word):
            if s[a] == word[b]:
                b += 1
            a += 1
        return b == len(word)
    
    • 使用双指针 ab 分别遍历 sword
    • s[a]word[b] 相等时,移动 b 指针,表示找到匹配的字符。
    • 无论是否匹配,都移动 a 指针,继续遍历 s
    • 最后,检查 b 是否等于 word 的长度,若相等,则说明 words 的子序列。

示例运行

示例 1

s = "abpcplea"
dictionary = ["ale","apple","monkey","plea"]
solution = Solution()
print(solution.findLongestWord(s, dictionary))  # 输出: "apple"

解释

  • 排序后的 dictionary["monkey", "apple", "plea", "ale"]
  • 检查 "monkey":不是 s 的子序列。
  • 检查 "apple":是 s 的子序列,返回 "apple"

示例 2

s = "abpcplea"
dictionary = ["a","b","c"]
solution = Solution()
print(solution.findLongestWord(s, dictionary))  # 输出: "a"

解释

  • 排序后的 dictionary["a", "b", "c"]
  • 检查 "a":是 s 的子序列,返回 "a"

时间复杂度分析

  • 排序

    • dictionary 进行排序,时间复杂度为 O(n log n),其中 ndictionary 的长度。
  • 子序列检查

    • 对于每个单词,最坏情况下需要遍历整个字符串 s,时间复杂度为 O(m),其中 ms 的长度。
    • 在最坏情况下,需要检查所有单词,因此子序列检查的总时间复杂度为 O(n * m)
  • 总体时间复杂度

    • O(n log n + n * m),其中 ndictionary 的长度,ms 的长度。

空间复杂度分析

  • 排序操作通常需要额外的空间,但在 Python 中,sort() 方法是就地排序,空间复杂度为 O(1)
  • 其他辅助空间主要来自于函数调用栈和变量,空间复杂度为 O(1)
  • 总体空间复杂度O(1)

总结

通过对字典进行合适的排序,并利用双指针法高效地检查子序列关系,我们能够在合理的时间内找到满足条件的最长单词。这个方法不仅直观,而且性能良好,适用于大多数情况下的字符串处理问题。

希望这篇博客能够帮助你更好地理解 LeetCode 第 524 题及其解决方案。如果你有任何疑问或更好的解决方法,欢迎在评论区交流!


http://www.kler.cn/a/451326.html

相关文章:

  • 一文掌握如何编写可重复执行的SQL
  • MySQL索引为什么是B+树
  • kimi搜索AI多线程批量生成txt原创文章软件-不需要账号及key
  • Unity3d 基于UGUI和VideoPlayer 实现一个多功能视频播放器功能(含源码)
  • Rust: offset祼指针操作
  • 【FAQ】HarmonyOS SDK 闭源开放能力 — Vision Kit(2)
  • Vue中使用a标签下载静态资源文件(比如excel、pdf等),纯前端操作
  • 【落羽的落羽 C语言篇】自定义类型——联合体、枚举
  • 【每日学点鸿蒙知识】沙箱目录、图片压缩、characteristicsArray、gm-crypto 国密加解密、通知权限
  • PyTorch 神经网络回归(Regression)任务:关系拟合与优化过程
  • 首次接触结构安全自动化监测系统,价格高吗?后期维护?
  • FreeRTOS的任务挂起和恢复
  • 高阶:基于Python paddleocr库 提取pdf 文档高亮显示的内容
  • eNSP安装教程(内含安装包)
  • 如何制作期末成绩查询小程序系统?
  • 【magic-dash】01:magic-dash创建单页面应用及二次开发
  • Cornerstone3d 基础概念
  • ECharts散点图-气泡图,附视频讲解与代码下载
  • Pytorch文件夹结构
  • 2024 年12月英语六级CET6听力原文(Long Conersation和Passage)
  • Java期末复习JDBC|网课笔记+校课总结
  • 麒麟系统修改配置镜像源地址并安装openGL
  • WebAssembly与WebGL结合:高性能图形处理
  • Python知识分享第三十五天-Pandas分组聚合
  • Linux 静默安装weblogic及JDK安装
  • chrome主页被被篡改的修复方法