【题目】
给你两个字符串 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 。
提示:
1 <= haystack.length, needle.length <= 104haystack和needle仅由小写英文字符组成
【题目解析】
解题思路
本问题的核心是在一个较长的字符串中查找一个较短字符串的第一个出现位置。这可以通过以下步骤实现:
- 特殊情况处理:如果
needle是空字符串,根据题目要求,返回 0。 - 遍历和匹配:遍历
haystack字符串的每个可能的起始位置,对每个位置,使用字符串的切片功能来比较当前位置开始的子字符串是否与needle相等。 - 返回匹配下标:如果在某个位置找到了匹配的子字符串,返回该位置的下标;如果遍历完整个
haystack也没有找到匹配项,返回 -1。
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
# 特殊情况处理:如果 needle 为空字符串,返回 0
if not needle:
return 0
# 遍历 haystack 字符串,检查每个可能的起始位置
for i in range(len(haystack) - len(needle) + 1):
# 使用切片来比较子字符串是否匹配
if haystack[i:i+len(needle)] == needle:
return i
# 如果未找到匹配项,返回 -1
return -1
执行
【总结】
适用问题类型
"在字符串中找出第一个匹配项的下标"问题属于字符串搜索与匹配的类别。这种类型的问题适用于需要在一个主字符串中查找一个子字符串的第一次出现位置的场景。这类问题广泛存在于文本处理、数据分析、模式识别和编程语言解析等领域。特别是在以下情况中,这种方法非常适用:
- 需要快速检查一个子字符串是否存在于主字符串中。
- 在一个大文本中搜索特定的关键词或模式。
- 实现自动化文本分析和数据提取工具。
使用的算法
解决此问题的算法是线性搜索算法,结合字符串切片的方法。算法的关键在于:
- 线性搜索:遍历主字符串
haystack的每个可能的起始位置。 - 字符串切片与比较:在每个位置,使用切片操作来获取与
needle字符串长度相同的子字符串,并与needle进行比较。 - 返回下标或 -1:如果找到匹配的子字符串,返回其在主字符串中的起始位置;如果没有找到,返回 -1。
算法细节
- 特别处理
needle为空字符串的情况,根据题目要求返回 0。 - 遍历
haystack,在每个位置对haystack[i:i+len(needle)]与needle进行比较。 - 如果匹配,则返回当前索引
i;如果遍历结束未找到匹配项,则返回 -1。
算法性能
- 时间复杂度为 O((N−M+1)×M),其中 N 是
haystack的长度,M 是needle的长度。这是因为需要对haystack中的每个长度为 MM 的子字符串进行比较。 - 空间复杂度为 O(1),因为除了输入字符串外,没有使用额外的存储空间。
总结与扩展
在字符串中找出第一个匹配项的下标问题是一个基础且实用的字符串处理问题。它不仅展示了如何有效地使用 Python 的切片功能来处理字符串,还提供了理解更复杂字符串匹配算法(如 KMP、Boyer-Moore、Rabin-Karp 等)的基础。此外,这个问题的解决方案也突出了算法设计中的一些关键考虑,如效率、易理解性和可扩展性。掌握这种基本的字符串搜索技术对于解决更广泛的编程问题非常有帮助,尤其是在涉及文本分析和模式匹配的应用中。