KMP
KMP
定义
若要在 abcbdbddd
中寻找cdb
则有
模式串:cdb
目标串:abcbdbddd
为目标串指针(i=1开始)
为模式串指针(j=1开始)
BF(暴力算法)
BF算法是一个普通的暴力匹配算法,其算法思想是先将目标串的第一位与模式串的第一位先进行匹配。若成功,则将匹配模式串与目标串的第二位,若不相等,则将匹配目标串的第二位与模式串的第一位。
模拟一下:
目标串:abeabeabas
模式串:abeabas
但是睿智的你肯定已经发现了,当我们在匹配失败时,没有必要将又重新回到,完全可以将 与其继续比较,这是因为时,,反正到此时已经保证串的 ~ 已经匹配。
由此我们在这里引入
border
定义:指的是字符串,在第位时,中最长的前缀与后缀相同的长度(不包括串本身)。
举例:有 ,则有
根据定义可以得到当与匹配时,在第匹配失效时,可以回到 继续比较。
举个例子:
但是若 则应当将 以继续比较
接下来便有一个问题,怎么快速求出?
可以观察,假设我们已经求出了,要求,怎么办?
显然我们可以令
若 则
反之,则继续上面的步骤,直到有成功的,或者(无满足的前缀与后缀)
并且显然有
所以有以下代码:
char S[maxn];
int border[maxn];
inline void getborder(){
int j=0;
border[1]=0;
for(int i=2;i<=ls;i++){
while(j&&S[i]!=S[j+1]) j=border[j];
if(S[i]==S[j+1]) j++;
border[i]=j;
}
}
KMP(看毛片)
算法流程:
先计算出,当然在其他题解里面可能是
再依次匹配
每次匹配时,表示匹配位的上一位,表示匹配位的下标。
那么当S[j+1]!=T[i]&&j!=0
时,一直取
若有 ,则
反之只有
CODE
j=0;
for(int i=1;i<=la;i++){
while(j&&a[i]!=b[j+1]) j=p[j];
if(a[i]==b[j+1]) j++;
if(j==lb) write(i-lb+1),j=p[j];
}
可能算法讲解有些迷糊,主要靠各位大佬们自行多次反复理解。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效