KMP求next数组
以下代码是求解 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数组
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人