KMP算法
简介
在
可以在
预处理
首先有一个定义:真前(后)缀是不包含原串的前(后)缀字串。
我们定义
以下我们模拟对一个字符串求
。没有真前(后)缀。 。 。 。 与 匹配。 。 与 匹配。 。 与 匹配。 。
特别地,
接下来介绍求法。
我们设
开始时,
当
此时要想起
当
匹配
只需要按照同样的步骤,当匹配的长度等于匹配串时,说明匹配成功。
Code
#include<bits/stdc++.h>
using namespace std;
int f[1000005];
void init(string &s) {
int len=s.size(),j=0;
f[0]=f[1]=f[2]=0;
for(int i=1;i<len;i++) {
while(j&&s[i]!=s[j]) j=f[j];
if(s[i]==s[j]) j++;
f[i+1]=j;//第 i 个字符
}
}
void kmp(string &s1,string &s2) {
int n=s1.size(),m=s2.size();
for(int i=0,j=0;i<n;i++) {
while(j&&s1[i]!=s2[j]) j=f[j];
if(s2[j]==s1[i]) j++;
if(j==m) {
cout<<i-m+2<<"\n";
j=f[j];
}
}
}
string s1,s2;
int main() {
cin>>s1>>s2;
init(s2);
kmp(s1,s2);
int l=s2.size();
for(int i=1;i<=l;i++) {
cout<<f[i]<<" ";
}
return 0;
}
本文作者:cjrqwq
本文链接:https://www.cnblogs.com/yfzqwq/p/18492795
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步