哎,老是忘了next数组应该怎么编号,记下来下次直接方便提醒自己
一句话概括next数组作用: kmp思想:对字符串进行预处理,记录与当前位置i前缀相同的“最近”位置,用next[i]记录
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<cmath>
using namespace std;
char a[1005];
int ne[1005];
void findnext()
{
int i = 0, j = -1;
ne[0] = -1;
int len = strlen(a);
while(i < len)
{
if(j == -1 || a[i] == a[j])
ne[++i] = ++j;
else j = ne[j];
}
}
int main()
{
cin>>a;
findnext();
for(int i = 0; i <= strlen(a); i ++)
cout<<ne[i]<<' '<<endl;
return 0;
}
int kmpcompare()
{
findnext();
int lena= strlen(a), lenb = strlen(b);
int i = 0, j = 0;//i标记母串的位置,j标记子串的位置
while(i < lena && j < lenb)
{
if(j == -1 || a[i] == b[j]){j ++; i ++;}//相等就共同进一位
else j = ne[j];
}
if(j == lenb) return i - j + 1;//结束条件
else return -1;
}