LeetCode 28. 實現 strStr()

28. 實現 strStr()


題目來源: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

  • 先找到 haystack 子串中第一個字符與 needle 字符串第一個字符相同的位置,從這裏開始進行匹配;
  • 逐個進行匹配,當出現不匹配的字符時,考慮回溯,將 p 指針重置爲這次匹配開始的下一位,便是 p - cur_len + 1;
  • 重複上面的過程,若徹底匹配,則返回匹配子串的起始座標,便是 p - N;最終都不匹配,則返回 -1。

(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()》 問題的主要內容。

歡迎關注微信公衆號《書所集錄》
相關文章
相關標籤/搜索