灵感来源
- 保持更新,努力学习
- python脚本学习
找出字符串中第一个匹配项的下标
解题思路
从 haystack
的第一个字符开始,依次将 needle
与 haystack
的各个子串进行比较,若匹配成功就返回当前子串的起始下标;若遍历完 haystack
都未找到匹配的子串,则返回 -1。
具体步骤
- 计算字符串长度:算出
haystack
和needle
的长度,分别记为n
和m
。n - m
就是haystack
中能够容纳needle
的最后一个可能的起始位置。 - 遍历
haystack
:从haystack
的第一个字符开始,以n - m
为终点,对每个字符进行遍历。这是因为从n - m + 1
位置开始的子串长度会小于m
,不可能与needle
匹配。 - 比较子串:对于
haystack
中的每个可能的起始位置i
,都要检查从该位置开始的长度为m
的子串是否与needle
匹配。具体做法是从needle
的第一个字符开始,逐个字符进行比较,若遇到不匹配的字符,就停止比较,然后将haystack
的起始位置向后移动一位,继续比较下一个子串。 - 匹配成功的处理:若
needle
的所有字符都能与haystack
中从i
开始的子串对应匹配,也就是j
等于m
,那就表明找到了匹配的子串,此时返回i
。 - 匹配失败的处理:若遍历完
haystack
都没找到匹配的子串,就返回 -1。def strStr(haystack, needle): n = len(haystack) m = len(needle) # 遍历所有可能的起始位置 for i in range(n - m + 1): j = 0 while j < m: if haystack[i + j] != needle[j]: break j += 1 if j == m: return i return -1 haystack = "sadbutsad" needle = "sad" print(strStr(haystack, needle))
逐行解释
def strStr(haystack, needle):
# 此函数用于在 haystack 字符串中查找 needle 字符串首次出现的下标
# haystack 为待搜索的主字符串
# needle 为要查找的子字符串
n = len(haystack)
# 计算 haystack 字符串的长度,并将其赋值给变量 n
m = len(needle)
# 计算 needle 字符串的长度,并将其赋值给变量 m
# 遍历所有可能的起始位置
for i in range(n - m + 1):
# 使用 for 循环来遍历 haystack 中所有可能作为 needle 起始位置的索引
# n - m + 1 是因为从这个位置之后的子串长度小于 needle 的长度,不可能匹配
# i 代表当前尝试匹配的起始索引
j = 0
# 初始化变量 j 为 0,j 用于遍历 needle 字符串中的字符
while j < m:
# 只要 j 小于 needle 的长度 m,就继续循环,目的是逐字符比较
if haystack[i + j] != needle[j]:
# 比较 haystack 中从索引 i 开始偏移 j 位置的字符和 needle 中索引为 j 的字符
# 如果不相等,说明从当前 i 位置开始的子串与 needle 不匹配
break
# 一旦发现不匹配,就使用 break 语句跳出当前的 while 循环
j += 1
# 如果当前字符匹配,将 j 加 1,继续比较下一个字符
if j == m:
# 如果 j 等于 m,说明 needle 中的所有字符都已经成功匹配
return i
# 此时返回当前的起始索引 i,它就是 needle 在 haystack 中首次出现的位置
return -1
# 如果遍历完所有可能的起始位置都没有找到匹配,返回 -1 表示未找到
# 以下是调用示例
haystack = "sadbutsad"
# 定义待搜索的主字符串
needle = "sad"
# 定义要查找的子字符串
print(strStr(haystack, needle))
# 调用 strStr 函数并打印结果