Python版Day9

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

 

你可能感兴趣的:(python,开发语言)