題目來源:https://leetcode-cn.com/problems/implement-strstrpython
實現 strStr() 函數。面試
給定一個 haystack 字符串和一個 needle 字符串,在 haystack 字符串中找出 needle 字符串出現的第一個位置 (從0開始)。若是不存在,則返回 -1。算法
示例 1:bash
輸入: haystack = "hello", needle = "ll" 輸出: 2
示例 2:微信
輸入: haystack = "aaaaa", needle = "bba" 輸出: -1
說明:函數
當 needle 是空字符串時,咱們應當返回什麼值呢?這是一個在面試中很好的問題。spa
對於本題而言,當 needle 是空字符串時咱們應當返回 0 。這與C語言的 strstr() 以及 Java的 indexOf() 定義相符。指針
思路:雙指針code
算法:blog
(p 是指向 haystack 字符的指針,q 是指向 needle 字符的指針,M 表示 haystack 字符的長度,N 表示 needle 字符的長度,cur_len 表示字符匹配的長度)
具體的過程以下圖所示:
class Solution: def strStr(self, haystack: str, needle: str) -> int: M, N = len(haystack), len(needle) if N == 0: return 0 p = 0 while p < M - N + 1: # 跳過子串首字符與 needle 首字符不一樣的字符 while p < M - N + 1 and haystack[p] != needle[0]: p += 1 cur_len = 0 q = 0 # 開始匹配 while q < N and p < M and haystack[p] == needle[q]: p += 1 q += 1 cur_len += 1 # 徹底匹配,返回結果 if cur_len == N: return p - N # 不匹配,回溯,從新匹配 p = p - cur_len + 1 return -1
以上就是使用雙指針的方法,先找到子串與給定字符首字符相同的位置,同時遍歷,子串與字符進行匹配,當不匹配時進行回溯,直到遍歷結束,進而解決《實現 strStr()》 問題的主要內容。
歡迎關注微信公衆號《書所集錄》