# Leetcode 28. Find the Index of the First Occurrence in a String ## 題解 ### Brute force ```python= class Solution: def strStr(self, haystack: str, needle: str) -> int: if needle in haystack: length = len(haystack) y = len(needle) for x in range(length): if haystack[x:y] == needle: return x y+=1 else: return -1 ``` ### Array increase performance ```python= class Solution: def strStr(self, haystack: str, needle: str) -> int: n,needn = len(haystack),len(needle) cur = ccur = 0 output = 0 queue = [] qc = 0 if n < needn: return -1 while cur < n and ccur < needn: if haystack[cur] == needle[0] and cur != output and cur not in queue: queue.append(cur) if haystack[cur] == needle[ccur]: if ccur == 0: output = cur ccur += 1 cur += 1 else: ccur = 0 if queue and qc < len(queue): cur = queue[qc] qc += 1 else: cur += 1 if needle[0:ccur] == needle: return output return -1 ``` ### KMP algorithms ```python= class Solution: def strStr(self, haystack: str, pattern: str) -> int: # KMP algorithms # m = haystack.size() # n = pattern.size() # Time complexity: O(m+n) # Space complexity: O(n) def builder() -> List[int]: nonlocal pattern i,j,n = 1,0,len(pattern) build = [0 for i in range(n)] while i < n: if pattern[i] == pattern[j]: build[i] = j + 1 i += 1 j += 1 else: if j != 0: j = build[j-1] else: build[i] = 0 i += 1 return build def finder() -> int: nonlocal haystack,pattern m = len(haystack) n = len(pattern) i = j = 0 build = builder() while m - j >= n - i: # haystack 要比 pattern 大 if haystack[j] == pattern[i]: if i == n - 1: return j - i i += 1 j += 1 else: if i != 0: i = build[i-1] else: j += 1 return -1 return finder() ```