共计 685 个字符,预计需要花费 2 分钟才能阅读完成。
提醒:本文最后更新于2025-03-07 17:21,文中所关联的信息可能已发生改变,请知悉!
介绍
关于前缀函数
我觉得在KMP之前先讲一下前缀函数会更好一些,所谓前缀函数就是指当前字符串
,那么前缀函数 ,相同的子串为 (我这里下标从 开始)。
前缀函数在KMP中的应用
我们观察一个这样的字符串
初始化next数组
int ne[N] ;
void init(){
for(int i = 2 ; j = 0; i < s.size() ; ++i){
while( j && s[i] != s[j+1]) j = ne[j] ;
if(s[i] == s[j+1]) ++ j ;
ne[i] = j ;
}
}
匹配字符串
for(int i = 0, j = 0 ; i < t.size() ; ++ i){
while( j && t[i] != s[j+1]) j = ne[j] ;
if(t[i] == s[j+1]) j ++ ;
if(j == s.size()-1){
cout << i - s.size() + 2 << " ";
j = ne[j] ;
}
}
时间复杂度为什么是
我们可以发现j的增加只会来自if(t[i] == s[j+1]) j ++ ;这一步,(j)的最大值就是母串长度,假设
正文完
发表至: 字符串
2024-08-17