kmp算法记录
最长公共前后缀学习:https://www.shpity.com/index.php/archives/262/
参考资料:https://www.geeksforgeeks.org/kmp-algorithm-for-pattern-searching/
https://iq.opengenus.org/prefix-table-lps/
# kmp, 旋转词 pattern = 'ABCDABD' target = '12345'+'12345' def longest_prefix_suffix(pattern): # 求解最长公共前后缀 lps = [0]*len(pattern) i, length = 1, 0 # length:前缀符的最后一个索引,i:后缀符的最后一个索引,不断向后探索 while i < len(pattern): # 在模式串长度内 print(f"i:{i}, length:{length}") if pattern[length] == pattern[i]: # 在模式串中前缀最后一个字符和后缀的最后一个字符相等,说明有可移动空间,length+1 length += 1 lps[i] = length i += 1 else: if length != 0: length = lps[length-1] # 回退到前一个区间去查找 else: lps[i] = 0 # length=0, lps归位, 目标更新到下一索引 i += 1 print(f"pattern:{pattern}, lps:{lps}\n") return lps lps = longest_prefix_suffix(pattern) print("lps", lps) M, N = len(pattern), len(target) i, j = 0, 0 while (N - i) >= (M - j): if target[i] == pattern[j]: # 模式串和目标串匹配了,i+1, j+1 i += 1 j += 1 if j == M: # j=M, 完全匹配,回退到前一大公共前后缀,继续往后匹配 print(f"find the pattern at index: {str(i-j)}, {target[i-j:]}") j = lps[j-1] # mismatch after j matches,i在索引范围内且位置j和位置i的字符没有匹配,进入该逻辑 elif i < N and pattern[j] != target[i]: if j != 0: j = lps[j-1] else: i += 1
时刻记着自己要成为什么样的人!
分类:
算法与数据结构
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)