标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。