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 Listclass 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 wordreturn ""def is_subsequence(self, s: str, word: str) -> bool:"""检查 word 是否是 s 的子序列。使用双指针法,遍历 s 和 word。"""a, b = 0, 0while a < len(s) and b < len(word):if s[a] == word[b]:b += 1a += 1return 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, 0while a < len(s) and b < len(word):if s[a] == word[b]:b += 1a += 1return 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.rhkb.cn/news/494845.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个比RTK或redux更轻量级更易使用的 React 第三方状态管理工具库的配置与使用

本文由作者 Samdy_Chan 原创,未经作者同意,请勿随意转载! 使用轻量级第三方的 React 状态管理库 zustand 管理共享状态数据 在 react 框架应用中,开发者应该大多数都是采用 redux 状态管理工具库来管理应用的共享状态数据,但用过 redux 的人都知道,其配置和使用相当复杂…

菜鸟带新鸟——基于EPlan2022的部件库制作

首先&#xff0c;我们需要了解一些概念&#xff1a; Eplan的部件制作内容 以上内容是制作一个完整的部件所需要的。如果公司要求没有那么严格&#xff0c;我们就可以制作1-4级的内容就可以满足日常的使用啦&#xff01; 部件的创建方式 部件创建方式有4类&#xff1a; 1、单…

Charles安装证书过程(手机)

背景&#xff1a;使用模拟器抓包时&#xff0c;发现https请求无法抓取&#xff0c;需要安装相应证书。我自己是因为模拟器升级了安卓7&#xff0c;发现之前安装的证书无效了&#xff0c;需要重新安装。 参考博客&#xff1a;夜神模拟器12Charles进行Https抓包_模拟器抓包ssl-C…

Windows、CentOS环境下搭建自己的版本管理资料库:GitBlit

可以搭建属于公司内部或者个人的Git服务器&#xff0c;方便程序代码及文档版本管理。 官网&#xff1a;http://www.gitblit.com/ Windows环境下安装 提前已经安装好了JDK。 官网下载Windows版的GitBlit。 将zip包解压到自己想要放置的文件夹下。 建立版本库路径&#xff0c…

数据库操作【JDBC HIbernate Mybatis】

JDBC JDBC编程 在java开发中&#xff0c;以前都是通过JDBC&#xff08;Java Data Base Connectivity&#xff09;与数据库打交道的&#xff0c;至少在ORM&#xff08;Object Relational Mapping&#xff09;框架没出现之前是这样&#xff0c;目前常用的ORM框架有JPA、hibernat…

Linux 常见用例汇总

注&#xff1a;本文为 Linux 常见用例文章合辑。 部分内容已过时&#xff0c;未更新整理。 检查 Linux 上的 glibc 版本 译者&#xff1a;joeren | 2014-11-27 21:33 问&#xff1a;检查 Linux 系统上的 GNU C 库&#xff08;glibc&#xff09;的版本&#xff1f; GNU C 库&…

web-密码安全口令

目录 一、密码安全概述 二、密码安全现状 三、破解方式 四、暴力破解 五、字典破解 六、密码字典 学习心得&#xff1a; 一、密码安全概述 现在很多地方都是以用户名&#xff08;账号&#xff09;和口令&#xff08;密码&#xff09;作为鉴权的方式&#xff0c;口令&am…

工控触摸屏用winForms来构建框架,效果还是很不错的

工控触摸屏采用 winForms 构建框架具有诸多优势。winForms 提供了丰富的控件和强大的开发工具&#xff0c;使得界面设计更加高效。它具有良好的稳定性和兼容性&#xff0c;能够适应工控环境的复杂要求。通过 winForms 可以实现直观的操作界面&#xff0c;方便操作人员进行监控和…

开发一个DApp项目:DeFi、DApp开发与公链DApp开发

随着区块链技术的快速发展&#xff0c;去中心化应用&#xff08;DApp&#xff09;逐渐成为创新技术的核心之一。DApp能够利用区块链去中心化的特点&#xff0c;提供更高的安全性、透明性和效率&#xff0c;吸引了越来越多的开发者和投资者关注。本文将围绕如何开发一个DApp项目…

网络下载ts流媒体

网络下载ts流媒体 查看下载排序合并 很多视频网站&#xff0c;尤其是微信小程序中的长视频无法获取到准确视频地址&#xff0c;只能抓取到.ts片段地址&#xff0c;下载后发现基本都是5~8秒时长。 例如&#xff1a; 我们需要将以上地址片段全部下载后排序后再合成新的长视频。 …

性能优化!突破性能瓶颈的尖兵CPU Cache

缓存这个专业术语&#xff0c;在计算机世界中是经常使用到的。它并不是CPU所独有的&#xff0c;比如cdn缓存网站信息&#xff0c;浏览器缓存网页的图像视频等&#xff0c;但本文讲述的是狭义Cache&#xff0c;主要指的是CPU Cache&#xff0c;本文将其简称为"缓存"或…

Redis+注解实现限流机制(IP、自定义等)

简介 在项目的使用过程中&#xff0c;限流的场景是很多的&#xff0c;尤其是要提供接口给外部使用的时候&#xff0c;但是自己去封装的话&#xff0c;相对比较耗时。 本方式可以使用默认&#xff08;方法&#xff09;&#xff0c;ip、自定义参数进行限流&#xff0c;根据时间…

010 Qt_输入类控件(LineEdit、TextEdit、ComboBox、SpinBox、DateTimeEdit、Dial、Slider)

文章目录 前言一、QLineEdit1.简介2.常见属性及说明3.重要信号及说明4.示例一&#xff1a;用户登录界面5.示例二&#xff1a;验证两次输入的密码是否一致显示密码 二、TextEdit1.简介2.常见属性及说明3.重要信号及说明4.示例一&#xff1a;获取多行输入框的内容5.示例二&#x…

RabbitMQ 的7种工作模式

RabbitMQ 共提供了7种⼯作模式,进⾏消息传递,. 官⽅⽂档:RabbitMQ Tutorials | RabbitMQ 1.Simple(简单模式) P:⽣产者,也就是要发送消息的程序 C:消费者,消息的接收者 Queue:消息队列,图中⻩⾊背景部分.类似⼀个邮箱,可以缓存消息;⽣产者向其中投递消息,消费者从其中取出消息…

WebAPI编程(第一天,第二天)

WebAPI编程&#xff08;第一天&#xff0c;第二天&#xff09; day01 - Web APIs 1.1. Web API介绍 1.1.1 API的概念1.1.2 Web API的概念1.1.3 API 和 Web API 总结 1.2. DOM 介绍 1.2.1 什么是DOM1.2.2. DOM树 1.3. 获取元素 1.3.1. 根据ID获取1.3.2. 根据标签名获取元素1.3.…

java如何使用poi-tl在word模板里渲染多张图片

1、poi-tl官网地址 http://deepoove.com/poi-tl/ 2、引入poi-tl的依赖 <dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version></dependency>3、定义word模板 释义&#xf…

web三、 window对象,延时器,定时器,时间戳,location对象(地址),本地存储-localStorage,数组去重new Set

一、window对象 window对象 是一个全局对象&#xff0c;也可以说是JavaScript中的 顶级对象 像document、alert()、console.log()这些都是window的属性&#xff0c;基本BOM的属性和方法都是window的 所有通过 var定义 在全局作用域中的 变量 、 函数 都会变成window对象的属…

利用Spring Cloud Gateway Predicate优化微服务路由策略

利用Spring Cloud Gateway Predicate优化微服务路由策略 一、Predicate简介 Spring Cloud Gateway 是 Spring 生态系统中用于构建 API 网关的框架&#xff0c;它基于 Project Reactor 和 Netty 构建&#xff0c;旨在提供一种高效且灵活的方式来处理 HTTP 请求和响应。 Spring …

C#代码实现把中文录音文件(.mp3 .wav)转为文本文字内容

我们有一个中文录音文件.mp3格式或者是.wav格式&#xff0c;如果我们想要提取录音文件中的文字内容&#xff0c;我们可以采用以下方法&#xff0c;不需要使用Azure Speech API 密钥注册通过离线的方式实现。 1.首先我们先在NuGet中下载两个包 NAudio 2.2.1、Whisper.net 1.7.3…

CASA(Carnegie-Ames-Stanford Approach) 模型原理及实践

植被作为陆地生态系统的重要组成部分对于生态环境功能的维持具有关键作用。植被净初级生产力&#xff08;Net Primary Productivity, NPP&#xff09;是指单位面积上绿色植被在单位时间内由光合作用生产的有机质总量扣除自养呼吸的剩余部分。植被NPP是表征陆地生态系统功能及可…