class Solution(object):
def strStr(self, haystack, needle):
"""
:type haystack: str
:type needle: str
:rtype: int
"""
if needle == '':
return 0
m = len(haystack)
n = len(needle)
if n > m:
return -1
prefix = self.get_prefix(needle)
i = 0
j = 0
while i < m:
# 匹配上的情况下i,j各加一
if haystack[i] == needle[j]:
i += 1
j += 1
if j == n:
return i - j
else:
# 不匹配的情况下,j发生变化,利用prefix
j = prefix[j]
# 变化之后判断j是否为-1,若为-1,j从0开始,i移动到下一位
if j == -1:
j = 0
i += 1
return -1
def get_prefix(self, p):
n = len(p)
prefix = [0] * n
l = 0
i = 1
while i < n:
if p[i] == p[l]: # 相等
l += 1
prefix[i] = l
i += 1
else: # 不相等
if l > 0: # l > 0
l = prefix[l-1]
else: # l < 0
prefix[i] = 0
i += 1
# 头部加-1,删掉最后一个元素
prefix = [-1] + prefix[:-1]
return prefix
```
- 参考资料:
[灯笼哥](https://www.bilibili.com/video/BV1Px411z7Yo/?spm_id_from=333.788.recommend_more_video.0)
KMP算法
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 最近研究了一下kmp算法(Knuth-Morris-Pratt),百度了好多帖子,看的稀里糊涂。为了自己可以简单理...
- 前言 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision pr...
- 1 需求分析 1.1 系统目标 实现题目说所要求的三种匹配算法的算法设计,算法实现,程序能够稳定,准确的运行并实现...
- 今天青石的票圈出镜率最高的,莫过于张艺谋的新片终于定档了。 一张满溢着水墨风的海报一次次的出现在票圈里,也就是老谋...