KMP之计算Next数组
KMP的Next数组:模式串的前缀与后缀的“相交”长度
KMP算法步骤:
1.先算next数组
2.若失配(此时模式串下标为j),利用Next数组求出失配后滑动的新位置
a.Next[j] \geq 0,则模式串右移 j-Next[j] 位
b.Next[j] = -1,则模式串右移 j+1 位
初始 i = 0, j = -1,Next[ 0 ] = -1(为了后面计算方便);
Step1:
由于j == -1,i&j++,且Next[i] = j,即Next[1] = 0; 此时 i = 1, j = 0;
下一个循环:p[ i ] != p[ j ],所以 j = Next[ j ] = Next[ 0 ] = -1,j回退
j == -1, i&j++,此时 i = 2, j = 0; Next[ i ] = j,即Next [ 2 ] = 0
Step2:
p [ 2 ] == p [ 0 ] -> i&j++ -> i = 3, j = 1, Next[ 3 ] = 1;
Step3:
p [ 3 ] == p [ 1 ] -> i&j++ -> i = 4, j = 2, Next[4] = 2;
Step4:
p [ 4 ] == p [ 2 ] -> i&j++ -> i = 5, j = 3, Next[5] = 3;
Step5:
p [ 5 ] == p [ 3 ] -> i&j++ -> i = 6, j = 4, Next[6] = 4;
Step6:
p [ 6 ] != p [ 4 ] -> 失配! -> j = Next[ j ] = Next [ 4 ] = 2
Step7:
p [ 6 ] != p [ 2 ] -> 失配! -> j = Next[ j ] = Next [2 ] = 0
Step8:
p [ 6 ] != p [ 0 ] -> 失配! -> j = Next[ j ] = Next [0 ] = -1
Step9:
j == -1 -> i&j++ -> i = 7, j = 0 -> Next[7] = 0
Step10:
p [ 7 ] != p [ 0 ] -> 失配! -> j = Next[ j ] = Next [0 ] = -1
Step11:
i !< strlen(p) -> 循环退出
int next[100] = { 0 };
void calNext(char *p, int *next)
{
next[0] = -1;
int i = 0, j = -1;
while (i < strlen(p)) {
if (j == -1 || p[i] == p[j]) //短路
{
i++;
j++;
next[i] = j;
}
else //j指针回退过程
j = next[j];
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用