28. 找出字符串中第一个匹配项的下标

发布时间 2023-10-28 19:58:32作者: Frommoon

题目

  • 给你两个字符串 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 。

法一、KMP

class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        def getNext(p):
            _next = [0] * (len(p)+1) #初始化next数组
            _next[0] = -1
            i,j = 0,-1
            while i  <len (p):
                if j==-1 or p[i] == p[j]:#如果j==-1或者两个指针的值相等
                    i+=1#i前进1步:匹配上了
                    j+=1#j前进1步:长度加1
                    _next[i]=j#把长度存进当前next数组
                else:#如果两个指针的值不相等
                    j=_next[j]#回到头部位置
          
            return _next
            
        def kmp(s,p,_next):
            i=j=0#i遍历主串j遍历子串
            while i<len(s) and j<len(p):
                if j==-1 or s[i]==p[j]:#匹配上了
                    i += 1#主串指针后移1位
                    j += 1#子串指针后移1位
                else:#匹配失效
                    #主串指针不动,子串指针查next数组进行移动
                    j=_next[j]
          
            if j==len(p):#字串走完了,每一个字母都匹配
                return i-j#返回主串中第一次出现子串的下标
            else:
                return -1
        return kmp(haystack,needle,getNext(needle))

法二、切片

class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        if needle in haystack:#先用in判断needle是否在haystack里
            for i in range(len(haystack)):#遍历haystack
                if haystack[i] == needle[0]:#找到与needle第一个字母相同的地方
                    if haystack[i:i+len(needle)] == needle:#再对haystack切片needle的长度,如果等于needle就返回答案了,如果不相等,就继续遍历。
                        return i
        else:#如果needle是否在haystack里直接返回-1
            return -1

法三、两行

class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        try:
            return haystack.index(needle)
        except:
            return -1