[ LeetCode ] 题刷刷(Python)-第28题:找出字符串中第一个匹配项的下标

server/2024/9/23 11:18:10/

题目描述

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回  -1 

示例

示例 1:

输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。
示例 2:

输入:haystack = "leetcode", needle = "leeto"
输出:-1
解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。

解题

解法一: 内置函数str.find()方法

思路

有点不讲武德,但是第一反应就想到这个方法了。

算法复杂度

时间复杂度:O(n),其中 n 是 haystack 的长度。


空间复杂度:O(1),即常数空间复杂度。

代码

python">class Solution:def strStr(self, haystack: str, needle: str) -> int:return haystack.find(needle)

解法二: 暴力破解

思路

从 haystack 的每个字符开始,依次比较后续字符是否与 needle 相同,直到找到匹配项或遍历完所有可能的起始位置。

算法复杂度

时间复杂度:O(n*m),其中 n 是 haystack 的长度,m 是 needle 的长度。


空间复杂度:O(1),即常数空间复杂度。

代码

python">class Solution:def strStr(self, haystack: str, needle: str) -> int:for i in range(len(haystack) - len(needle) + 1):  # 遍历所有可能的起始位置if haystack[i:i+len(needle)] == needle:  # 完全匹配 needlereturn i  # 返回 needle 在 haystack 中的起始位置return -1  # 未找到 needle,返回 -1

解法三: KMP算法

思路

从 haystack 的每个字符开始,依次比较后续字符是否与 needle 相同,直到找到匹配项或遍历完所有可能的起始位置。

原理找个视频看一下,手工推算,然后尝试写成代码。

算法复杂度

时间复杂度:O(n+m),其中 n 是 haystack 的长度,m 是 needle 的长度。


空间复杂度:O(m),其中m 是 needle 的长度。

代码

python">class Solution:def strStr(self, haystack: str, needle: str) -> int:# 如果 needle 为空字符串,其在 haystack 中的起始位置为 0if not needle:return 0# 构建 KMP 部分匹配表(LPS)lps = self._get_lps(needle)# 初始化双指针 i 和 j 分别指向 haystack 和 needle 的起始位置i, j = 0, 0# 当 i 未到达 haystack 的末尾时,继续搜索while i < len(haystack):# 如果当前字符匹配,移动两个指针到下一个字符if haystack[i] == needle[j]:i += 1j += 1# 如果 j 到达 needle 的末尾,说明找到了完整的 needle,返回其在 haystack 中的起始位置if j == len(needle):return i - j# 如果当前字符不匹配且 j > 0,利用 LPS 表回退 j 指针至下一个最长前后缀重合位置elif j > 0:j = lps[j - 1]# 如果当前字符不匹配且 j == 0,说明 needle 无法在当前位置继续匹配,i 指针右移一位else:i += 1# 若遍历完 haystack 仍未找到 needle,返回 -1 表示未找到return -1# 私有辅助方法,用于生成 KMP 部分匹配表def _get_lps(self, pattern: str) -> List[int]:# 初始化长度为 pattern 长度的 LPS 表,初始值均为 0lps = [0] * len(pattern)# 初始化 j 指针指向 pattern 的第二个字符j = 0# 从 pattern 的第二个字符开始遍历,直至最后一个字符for i in range(1, len(pattern)):# 当 j > 0 且 pattern[i] 与 pattern[j] 不匹配时,回退 j 至 LPS 表中对应的前一位置while j > 0 and pattern[i] != pattern[j]:j = lps[j - 1]# 当 pattern[i] 与 pattern[j] 匹配时,将 j 向右移动一位if pattern[i] == pattern[j]:j += 1# 更新 LPS 表中对应位置的值为当前 j 的值lps[i] = j# 返回计算好的 LPS 表return lps

http://www.ppmy.cn/server/11807.html

相关文章

前端学习<四>JavaScript基础——44-键盘事件

鼠标的拖拽事件 拖拽的流程&#xff1a; &#xff08;1&#xff09;onmousedown&#xff1a;当鼠标在被拖拽元素上按下时&#xff0c;开始拖拽&#xff1b; &#xff08;2&#xff09;onmousemove&#xff1a;当鼠标移动时被拖拽元素跟随鼠标移动&#xff1b; &#xff08;…

路由引入,过滤实验

实验拓补图 实验目的&#xff1a; 1、按照图示配置 IP 地址&#xff0c;R1&#xff0c;R3&#xff0c;R4 loopback口模拟业务网段 2、R1 和 R2 运行 RIPv2,R2&#xff0c;R3和R4运行 OSPF&#xff0c;各自协议内部互通 3、在 RIP 和 oSPF 间配置双向路由引入,要求除 R4 上的…

FLAML框架学习干货整理

一、FLAML介绍 FLAML (Fast and Lightweight AutoML) 是一个用于自动机器学习&#xff08;AutoML&#xff09;的 Python 库&#xff0c;旨在快速且资源效率高地找到机器学习任务的最优模型和其超参数。它由微软研究院开发&#xff0c;适用于广泛的机器学习任务&#xff0c;如分…

VUE-列表

VUE-列表 列表功能 如下例子 列表展示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv&qu…

AUTOSAR-COMStack-003_SignalGroup如何发送接收

1. Ref Ref.1 AUTOSAR_RS_Main.pdf Ref.1 AUTOSAR_RS_Features.pdf Ref.2 AUTOSAR_SRS_COM.pdf Ref.3 AUTOSAR_SWS_COM.pdf 2. 为什么要使用Signal Group&#xff1f; 2.1 Traceabilty [RS_PO_00004] AUTOSAR shall define an open architecture for automotive software.…

python基本语法与使用

Python是一种高级编程语言&#xff0c;它被广泛应用于各种领域&#xff0c;包括Web开发、数据科学、人工智能等。以下是Python的基本语法和使用方法&#xff1a; 1.注释 使用#来添加单行注释&#xff0c;多行注释可以使用或"""来包围。 # 这是一个单行注释…

Mac 安装pnpm报错

npm install -g pnpm 报错截图&#xff1a; 报错原因&#xff1a;权限 解决方法&#xff1a;sudo npm install -g pnpm --allow-root 输入密码即可

第二篇、SD真人视频转卡通动画 学习笔记

接着第一篇 2K转4K 生成玩卡通视频后&#xff0c;如何转换成更高分辨率的视频 1、将第一篇生成的工作目录下的output目录改成output-old&#xff0c;新建一个output目录 2、进入0&#xff0c;1子目录&#xff0c;把EbSynth生成的Outputxxx都删掉&#xff0c;frames和keys下…