#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 7;
int ne[N];
void get_next(string p) {
ne[0] = 0; // 第一个字符的最长相同前缀后缀为0
int len_p = p.size();
for(int i = 1, j = 0; i < len_p; i++) {
while(j && p[i] != p[j]) j = ne[j - 1]; //如果不相同,移动p,这里如果j=0并且两个字符还不相同,也就默认ne[i] = 0了
if(p[i] == p[j]) { //如果相同,则得到该位置ne[i]的值,继续向后比较
j++;
ne[i] = j;
}
}
}
int kmp(string s,string p) {
int len_s = s.size();
int len_p = p.size();
for(int i = 0, j = 0; i < len_s; i++)
{
while(j && s[i] != p[j]) j = ne[j - 1];
if(s[i] == p[j])
{
j++; // 两者相等,继续匹配
}
if(j == len_p)
{
return i - j + 1;//匹配成功,返回下标
}
}
return -1;// 未匹配成功,返回-1
}
int main( ) {
return 0;
}
字符串--KMP
于 2023-08-11 21:30:50 首次发布