[C算法]006-KMP算法

[C算法]006-KMP算法

Lucas Lv5

求 next 数组(未优化)

按照 next 数组访问字符串下标的做法求 next 数组

a b a a b c 为例,next[] 数组下标从 1 开始
首先,next 数组以 0 1 开头,i 是当比较的下标,j 是待匹配下标。

  1. next={0,1},求 next[3]i=2j=next[i],就是 j=1
    • i=2j=1,对比 p2(b)!=p1(a)p_2(b)!=p_1(a),匹配失败 ❌
    • 然后 j=next[j],就是 j=0
    • 触发 j=0,直接 next[3]=1
  2. next={0,1,1},求 next[4]i=3j=next[i],就是 j=1
    • i=3j=1,对比 p3(a)==p1(a)p_3(a)==p_1(a),匹配成功 ✅,所以 next[4]=j+1,就是 2
  3. next={0,1,1,2},求 next[5]i=4j=next[i],就是 j=2
    • i=4j=2,对比 p4(a)!=p2(b)p_4(a)!=p_2(b) 匹配失败 ❌
    • 然后 j=next[j],就是 j=1
    • 然后再对比 p_4(a)==p_1(a) 匹配成功 ✅,所以 next[5]=j+1,就是 2
  4. next={0,1,1,2,2},求 next[6]i=5j=next[i],就是 j=2
    • i=5j=2,对比 p5(b)==p2(b)p_5(b)==p_2(b),匹配成功 ✅,所以 next[6]=j+1 就是 3
  5. next={0,1,1,2,2,3} 计算完毕。

对应代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#define MAX_SIZE 10

typedef struct {
char str[MAX_SIZE];
int len;
} SString;

void get_next(SString t, int next[]) {
int i = 1, j = 0;
next[1] = 0;
while (i < t.len) {
if (j == 0 || t.str[i] == t.str[j]) {
++i;
++j;
next[i] = j; // 若 pi=pj,则 next[j+1]=next[j]+1
} else {
j = next[j]; // 否则 j=next[j]
}
}
}

这是为数不多的让我感觉困惑的算法了,确实很有难度,逻辑很绕,多品味几次还是能搞懂的。

  • 标题: [C算法]006-KMP算法
  • 作者: Lucas
  • 创建于 : 2026-03-26 15:55:48
  • 更新于 : 2026-03-30 08:55:42
  • 链接: https://darkflamemasterdev.github.io/2026/03/26/C算法-006-KMP算法/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
[C算法]006-KMP算法