28. 找出字符串中第一个匹配项的下标
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution:
# 搭建next数组
# i 指向后缀末尾位置
# j 指向前缀末尾位置 初始化为-1
# next[i]表示i(包括i)之前最长相等的前后缀长度 (即j)
# next[0] = j
# i从1开始
# 如果s[i] 与s[j+1]不相同即前后缀末尾不相同,就要回退
# 就要找J+前一个元素在next数组里的值
# j = next[j]
# 如果s[i]与s[j+1]相同即前后缀相同,那么就同时向后移动i和j
# 说明找到了相同的前后缀,同时还要将j(前缀的长度)
# 赋给next[i],因为next[i]记录最长相等前后缀的长度
def getNext(self,next,s):
j = -1
next[0] = j
for i in range(1,len(s)):
while j >=0 and s[i]!=s[j+1]:
j=next[j]
if s[i] == s[j+1]:
j+=1
next[i] = j
# haystack 文本串 s
# needle 模式串 t
# 使用next数组来做匹配
# 两个下标
# j指向模式串起始位置, 初始值为-1
# i指向文本串起始位置,从0开始遍历
# 如果s[i]与t[j+1] 不相同,j就要从next数组里找下一个匹配位置
# 如果s[i]与t[j+1] 相同,那么i和j同时向后移动
# 如果j指向了模式串t的末尾那么就说明模式串t完全匹配文本串s
# 返回值为当前位置的i-模式串的长度
def strStr(self, haystack: str, needle: str) -> int:
if not needle:
return 0
next = [0]*len(needle)
self.getNext(next,needle)
j = -1
for i in range(len(haystack)):
while j >=0 and haystack[i]!= needle[j+1]:
j = next[j]
if haystack[i]==needle[j+1]:
j +=1
if j == len(needle)-1:
return i - len(needle) + 1
return -1