28. Implement strStr() [easy] (Python)

来源:互联网 发布:淘宝待评价怎么消除 编辑:程序博客网 时间:2024/05/23 16:39

题目链接

https://leetcode.com/problems/implement-strstr/

题目原文

Implement strStr().

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

题目翻译

实现 strStr() 函数。该函数用于判断一个字符串 needle 是否是另一个字符串 haystack 的子串。如果是,则该函数返回 needle 在 haystack 中首次出现的地址;否则,返回-1。

思路方法

思路一

既然是要求自己实现strStr函数,那么用库函数string.find()就不合适了吧。。。虽然不合适,也放在这里供参考吧。

代码

class Solution(object):    def strStr(self, haystack, needle):        """        :type haystack: str        :type needle: str        :rtype: int        """        return haystack.find(needle)

思路二

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

代码

class Solution(object):    def strStr(self, haystack, needle):        """        :type haystack: str        :type needle: str        :rtype: int        """        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

思路三

利用类似substring的方法简化上面的代码。

代码

class Solution(object):    def strStr(self, haystack, needle):        """        :type haystack: str        :type needle: str        :rtype: int        """        for i in xrange(len(haystack) - len(needle) + 1):            if haystack[i:i+len(needle)] == 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

PS: 新手刷LeetCode,新手写博客,写错了或者写的不清楚还请帮忙指出,谢谢!
转载请注明:http://blog.csdn.net/coder_orz/article/details/51708389

0 0
原创粉丝点击