[leetcode]#28. Implement strStr()

来源:互联网 发布:网络代理平台 编辑:程序博客网 时间:2024/06/05 05:13
  • 题目翻译
    实现 strStr() 函数。该函数用于判断一个字符串 needle 是否是另一个字符串 haystack 的子串。如果是,则该函数返回 needle 在 haystack 中首次出现的地址;否则,返回-1。

  • 扫描haystack,当遇到与needle首字符相同的位置时,检查haystack从该位置开始的与needle长度相同的块,与needle是否相同

if not needle:            return 0        for i in xrange(len(haystack) - len(needle) + 1):            if haystack[i] == needle[0]:                j = 1                while j < len(needle) and haystack[i+j] == needle[j]:                    j += 1                if j == len(needle):                    return i        return -1
  • 鉴于这是一个模式匹配问题,我们可以考虑KMP算法。该算法对于任何模式和目标序列,都可以在线性时间内完成匹配查找(O(n+m)),而不会发生退化。这里不再细讲算法原理,只实现了代码。
class Solution(object):    def strStr(self, haystack, needle):        """        :type haystack: str        :type needle: str        :rtype: int        """        if not needle:            return 0        #generate next array, need O(n) time        i, j, m, n = -1, 0, len(haystack), len(needle)        next = [-1] * n        while j < n - 1:              #needle[k] stands for prefix, neelde[j] stands for postfix            if i == -1 or needle[i] == needle[j]:                   i, j = i + 1, j + 1                next[j] = i            else:                i = next[i]        #check through the haystack using next, need O(m) time        i = j = 0        while i < m and j < n:            if j == -1 or haystack[i] == needle[j]:                i, j = i + 1, j + 1            else:                j = next[j]        if j == n:            return i - j        return -1
原创粉丝点击