ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

kmp算法记录

2022-08-12 20:33:45  阅读:174  来源: 互联网

标签:target 记录 后缀 pattern lps length 算法 kmp print


最长公共前后缀学习: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

 

标签:target,记录,后缀,pattern,lps,length,算法,kmp,print
来源: https://www.cnblogs.com/demo-deng/p/16581236.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有