首页 > 其他分享 >KMP

KMP

时间:2023-10-17 17:35:30浏览次数:28  
标签:__ SqString else KMP print next

from SqString import SqString
MaxSize=100
def GetNext(t,next): #由模式串t求出next值
j,k=0,-1
next[0]=-1
while j<t.getsize()-1:
if k==-1 or t[j]==t[k]: #j遍历后缀,k遍历前缀
j,k=j+1,k+1
next[j]=k
else: k=next[k] #k置为next[k]

def KMP(s,t): #KMP算法
next=[None]*MaxSize
GetNext(t,next) #求next数组
i,j=0,0
while i<s.getsize() and j<t.getsize():
if j==-1 or s[i]==t[j]:
i,j=i+1,j+1 #i,j各增1
else: j=next[j] #i不变,j回退
if j>=t.getsize():
return(i-t.getsize()) #返回起始序号
else:
return(-1) #返回-1

if __name__ == '__main__':
cstr1="aaabaaaab"
s=SqString()
s.StrAssign(cstr1)
print("s: ",end='');s.DispStr()

cstr2="aaaab"
t=SqString()
t.StrAssign(cstr2)
print("t: ",end='');t.DispStr()

print("KMP: %d" %(KMP(s,t)))

 

标签:__,SqString,else,KMP,print,next
From: https://www.cnblogs.com/simple-one/p/17770234.html

相关文章

  • KMP模式匹配算法
    例题展示例题解决......
  • 串的模式匹配-KMP算法
    一个古老的模式匹配算法。优点在于不需要回溯主串指针。在整个匹配过程中,只需要从头到尾扫描主串一次,方便处理那种大文件。具体实现方法是对子串进行预处理,求得next数组。这个数组记录的信息是:如果子串的当前比较位与主串不匹配,那么接下来应该把子串的哪个位与主串的当前位(因......
  • Z 函数 / 扩展 KMP
    前置\(KMP\):\(O(n)\)求解字符串匹配的算法。维护前缀数组\(p_i\)表示字符串\(s\)以\(i\)结尾的最长公共前后缀的长度;\(border\):对于字符串\(s\),如果存在一个子串\(t\)满足\(t\)既是\(s\)的一个前缀又是\(s\)的后缀,则称\(t\)是\(s\)的一个border;Z函数......
  • KMP算法
    根本原理有限状态机资料链接https://zhuanlan.zhihu.com/p/83334559注:大小设置为256是因为Java的英文采用8位ASCII码,最大值为256......
  • KMP 字符匹配
    忘了具体什么时候写的,应该是2023.8初这算是个算法复习,因为我太菜了以前学的都不会了。KMP字符匹配有一说一这个我讲不来,大概意思就列这好了:Knuth(D.E.Knuth)&Morris(J.H.Morris)&Pratt(V.R.Pratt)提出的字符串匹配算法,简称KMP。KMP算法应该是最基础的字符串匹配算法了,......
  • [学习笔记] ex-KMP
    简介exKMP(扩展KMP算法),也叫Zalgorithm(Z算法),可以在\(\mathcal{O}(|s|+|t|)\)求解文本串\(s\)的所有后缀与匹配串\(t\)的最长公共前缀(LCP)。实现定义一个长度为\(n\)的字符串\(s\)的\(z\)函数\(z_i\)表示\(s\)长度为\(i\)的后缀与自身的最长公共前缀的长度......
  • KMP字符串匹配算法
    挑战最通俗的KMP算法讲解什么是\(KMP\)KMP是一种用于模式串匹配问题的算法。给出一个文本串和模式串,查询模式串在文本串中的(出现次数、出现位置等等)的问题称为“模式串匹配问题”。KMP算法的本质是:针对模式串构建一个特定的数组,用于在匹配失败时减少后续匹配过程中的无用比......
  • 2023 ICPC 网络赛2 L Super-palindrome 字符串 border KMP dp
    传送门给出一个\(5000\)长的字符串判断有多少个连续子串是超级回文的。这里超级回文的定义是将字符串分成\(2k\)段每段按照回文对应相等。设\(f_{l,r}\)表示区间\(l,r\)是否是符合要求的。引入\(border\)的定义:最长的前缀和后缀匹配长度。容易想到我们如果暴力枚举每个区间来......
  • KMP
    写在前面本篇代码来源于皎月半撒花大佬的博客(指路)加上了一些自己的理解,重写了代码注释,可能算转载plus罢(好像每次都是这样的)(找好看的代码来背)代码注释以洛谷P3375为例。#include<bits/stdc++.h>usingnamespacestd;constintN=1e6+6;intnex[N],lens,lent;char......
  • KMP算法
    KMP算法可以看做是对暴力求解的一种改进,在前面的暴力算法中,i指针和j指针都是要回溯的,这是不合理的,因为当发现不匹配的时候,已经扫描到的区域我们其实是已知的,如下图所示当我们发现不匹配后,我们其实已经知道了主串的第1到第5个字符是什么,其实就是模式串前面的字符,KMP算法就是将这......