专栏文章
KMP,字符串算法万恶的源头
个人记录参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mingyskf
- 此快照首次捕获于
- 2025/12/02 02:15 3 个月前
- 此快照最后确认于
- 2025/12/02 02:15 3 个月前
默认下文所有字符串的下标从 开始。下文用 表示 顺次拼接出的字符串,即 在下标区间 内的子串。
学会 KMP,要先学会求 border。
border 是一个字符串 对应的长度为 的数组。对 的定义为:在字符串 中,使得 的最大可能值 (需要满足 )。
其求法为:假设当前已经求出了 ,需要求 ,则定义一个值 ,初始 ,进行下面的操作:
- 如果 ,则 就是 ,赋值并结束操作。
- 反之,让 。
- 如果此时 ,则 ,结束操作,否则回到第一步继续操作。
其实就是一个让 与 不断匹配的过程,这里的 满足 。复杂度感性理解就是线性的。
至此,border 已经求完了。
代码
CPPfo(i,1,n){
int tp=border[i-1];
while (tp&&s[i]!=s[tp+1])
tp=border[tp];
if (s[i]==s[tp+1])
tp++;
border[i]=tp*(i>1);
}
在字符串 中匹配 字符串的做法是类似的,如果 与 匹配,就 ;否则就让 ,继续匹配。复杂度也是线性的。
KMP 算法可以用来优化 dp。比如
P3082 这个题,在求出 border 之后,dp 的过程相当于 KMP 匹配字符串的算法,可以优化时间复杂度。
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...