面试经典150题 P28 找出字符串中第一个匹配项的下标
时间轴
2025-10-06
init
题目:
实际上直接用 C++的 string.find 函数就能求值
1 |
|
但是显然这题考察 KMP :
1 | class Solution { |
求解 next 数组的例子
我们用最经典的模式串:
1 | p = "ababaca" |
下标:
1 | index: 0 1 2 3 4 5 6 |
我们要求 next[i]:
1 | next[i] = p[0..i] 的最长相同前后缀长度 |
前缀:从开头开始
后缀:从结尾结束(但不能等于整个字符串)
初始化
1 | next[0] = 0 |
因为:”a” 没有前后缀
i = 1
1 | p[1] = b |
比较:b != a,因为 j = 0,不能再回退。
1 | next[1] = 0 |
当前:
1 | next = [0,0] |
i = 2
1 | p[2] = a |
匹配成功:
1 | j++ |
所以:
1 | next[2] = 1 |
当前:
1 | next = [0,0,1] |
解释:
1 | aba |
i = 3
1 | p[3] = b |
匹配:
1 | j++ |
当前:
1 | next = [0,0,1,2] |
解释:
1 | abab |
i = 4
1 | p[4] = a |
匹配:
1 | j++ |
当前:
1 | next = [0,0,1,2,3] |
解释:
1 | ababa |
i = 5(关键回退)
1 | p[5] = c |
不匹配:
1 | c != b |
开始回退:
1 | j = next[j-1] |
继续比较:
1 | p[5] = c |
仍然不匹配:
1 | j = next[j-1] |
现在:j = 0 停止。
1 | next[5] = 0 |
当前:
1 | next = [0,0,1,2,3,0] |
i = 6
1 | p[6] = a |
匹配:
1 | j++ |
最终结果
1 | p = a b a b a c a |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 常想一二,不思八九!
评论