leetcode28_Implement strStr()

橘子oly發表於2016-10-24

一.問題描述

Implement strStr().

Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.

二.程式碼編寫

    最基本的想法就是,為兩個字串指定兩個指標,相同則兩個指標後移,不同則子串回退到0,母串往前回退i-j+1個字元。顯然,時間複雜度是O(mn),程式碼如下:

class Solution(object):
    def strStr(self, haystack, needle):
        """
        :type haystack: str
        :type needle: str
        :rtype: int
        """
        len_hay = len(haystack)
        len_nee = len(needle)
        i = 0 # pointer for haystack
        j = 0 # pointer for needle
        while i < len_hay and j < len_nee:
            if haystack[i] == needle[j]:
                i += 1
                j += 1
            else:
                i = i - j + 1
                j = 0
        if j == len_nee:
            return i - len_nee
        else:
            return -1

三.演算法優化

    以儘量減少冗餘計算來看待上述問題會發現,每次遇到不相同的字元時,兩個子串均向前回退,顯然造成了冗餘的計算量,有沒有辦法巧妙地記住已經比較過的規律,使每次回退的字元數減少呢?這就是KMP演算法的基本思想。

  KMP演算法通過next()陣列,可以得到每次移動的長度,其時間複雜度為O(m+n)

相關文章