【編程題】【leetcode28】KMP

【難度:easy】

【時間複雜度:O(m + n)】

class Solution(object):
    def strStr(self, haystack, needle):
        """
        :type haystack: str
        :type needle: str
        :rtype: int
        """
        # 回溯
        if not needle:
            return 0
        if haystack == needle:
            return 0
        # neelen = len(needle)
        # for i in range(len(haystack) - neelen + 1):
        #     if haystack[i:i + neelen] == needle:
        #         return i
        # return -1
        
        # KMP
        dpnext = [0] * len(needle) # ABCDABD # [-1, 0,0,0,1,2]
        dpnext[0] = -1
        k = -1
        j = 0
        while j < len(needle) - 1: 
            if k == -1 or needle[k] == needle[j]:
                j += 1
                k += 1
                dpnext[j] = k
            else:
                k = dpnext[k]
        # print(dpnext)
        i, j = 0, 0
        while i < len(haystack) and j < len(needle):
            if j == -1 or haystack[i] == needle[j]:
                i += 1
                j += 1
            else:
                j = dpnext[j]
        if j >= len(needle):
            return i - j
        return -1
            
        
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章