LeetCode:28. Implement strStr() - KMP算法 - Python

问题描述:

实现 strStr() 函数

给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回  -1

示例 1:

输入: haystack = "hello", needle = "ll"
输出: 2

示例 2:

输入: haystack = "aaaaa", needle = "bba"
输出: -1

说明:

当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。

对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。

问题分析:

这个应该比较简单,KMP算法就可以解决了,当然Python也可以一行代码实现(return haystack.find(needle)),感觉这样就失去了这个题目的意义了哈。至于kmp这个经典算法,就不过多解释了,之所以总结是感觉以后这个算法还会用到。

Python3实现:

# @Time   :2018/7/3
# @Author :LiuYinxing
# 解题思路 kmp 算法


class Solution:
    def strStr(self, haystack, needle):
        if len(needle) == 0: return 0

        n, m = len(haystack), len(needle)
        next = [0] * m
        self.GetNext(needle, next)  # 初始化next数组

        i, j = 0, 0
        while i < n and j < m:
            if j == -1 or haystack[i] == needle[j]:
                i, j = i + 1, j + 1
            else:
                j = next[j]

        return i - m if j >= m else -1

    def GetNext(self, t, next):  # 计算next数组
        j, k, next[0], n = 0, -1, -1, len(next)
        while j < n - 1:
            if k == -1 or t[j] == t[k]:
                j, k = j + 1, k + 1
                next[j] = k
            else:
                k = next[k]


if __name__ == '__main__':
    haystack, needle = 'hello', 'll'
    solu = Solution()
    print(solu.strStr(haystack, needle))

Python3改进版实现:

# @Time   :2018/7/6
# @Author :LiuYinxing
# 解题思路 kmp 算法,next数组改进版


class Solution:
    def strStr(self, haystack, needle):
        if len(needle) == 0: return 0

        n, m = len(haystack), len(needle)
        next = [0] * m
        self.GetNext(needle, next)  # 初始化next数组

        i, j = 0, 0
        while i < n and j < m:
            if j == -1 or haystack[i] == needle[j]:
                i, j = i + 1, j + 1
            else:
                j = next[j]

        return i - m if j >= m else -1

    def GetNext(self, t, next):  # 计算改进版next数组
        j, k, next[0], n = 0, -1, -1, len(next)
        while j < n - 1:
            if k == -1 or t[j] == t[k]:
                j, k = j + 1, k + 1
                if t[j] != t[k]:
                    next[j] = k
                else:
                    next[j] = next[k]
            else:
                k = next[k]


if __name__ == '__main__':
    haystack, needle = 'hello', 'll'
    solu = Solution()
    print(solu.strStr(haystack, needle))

欢迎指正哦

你可能感兴趣的:(算法,Python,LeetCode)