KMP求next数组

发布时间 2023-10-06 10:01:48作者: ahahaha~~~

以下代码是求解 next 数组的大致过程


//j-->前缀末尾的位置,也代表着 i之前,包括 i的子串的最长相等前后缀的长度
//i-->后缀末尾的位置
//ne[i]-->字符串s[0,i] 中的最长相等前后缀长度

cin>>n>>s;
next[0]=0; int j=0;//初始化
for(int i=1;i<s.size();i++)// i = 1是因为字符串下标是从0开始的
{

  while(j>0&&s[i]!=s[j])//前缀末尾和后缀末尾不匹配的时候,j要向前回退,也就是j看它前一位的next数组的值,所对应的值就是要回退到的下标
    j=next[j-1];
  if(s[i]==s[j])//前后缀相同情况
    j++;
  next[i]=j;//更新next数组
}
##########################
//字符串的下标是从1开始的代码
cin>>n;
cin>>s+1;
int j=0;
ne[1]=0;
for(int i=2;i<=n;i++)
{
  while(j>0&&s[i]!=s[j+1]) j=ne[j];
  if(s[i]==s[j+1]) j++;
  ne[i]=j;
  //cout<<ne[i]<<"\n";
}
@@@@@@@@@@@@@@@@@@
//最长相等前后缀数组整体向右移动一位,初始值为 -1 的代码
cin>>n>>s;
int j=0,k=-1;
ne[0]=-1;
while(j<n)
{
  if(k==-1||s[j]==s[k])
  {
    k++;
    j++;
    ne[j]=k;
  }
  else
    k=ne[k];
}

/*
步骤:
1.初始化
2.前后缀不同的情况
3.前后缀相同的情况
4.更新next数组