获得徽章 0
赞了这篇沸点
28. 实现 strStr()

思路1: 暴力
见代码

思路2: KMP算法 (双指针)
先通过计算一个叫next的数组, next[i] 表示 [0,i]之间最长的公共前后缀的长度. 它的意义在于当模式串[j]和主串[i]发生不匹配时, 直接用next[j - 1] 位置继续与主串的i开始比较即可, 不必再从模式串的头开始匹配.



核心在于如何计算next数组. 就是计算每个位置next[i]的最长公共前后缀的长度

比如 ABABAA
next[0] = 0 , A
next[1] = 0 , AB
next[2] = 1 , ABA
next[3] = 2 , ABAB
next[4] = 3 , ABABA
next[5] = 1 , ABABAA

在代码实现上通过定义前后缀两个指针去迭代计算最长公共前后缀的长度

1) 当 pattern[j] == pattern[i] 时, 前后缀指针同时加1即可

2)但是当 pattern[j] != pattern[i] 时, 但是它们的上一部分(公共前后缀) 是匹配的. 所以从 next[j - 1] 开始计算公共前后缀(即 [0, j-1]的 最长公共前后缀),
此时再判断上一个公共部分j 与 当前公共部分的i 比较. 此时同理再次判断 i 和 j 是否不匹配. 匹配走上面 “1)” 过程 , 不匹配重复走的"2)" 过程.

总的来说就是不断缩小可能的公共部分去比较, 进而找到最长的公共前后缀.
展开
李白的手机于2021-03-14 14:07发布的图片
李白的手机于2021-03-14 14:07发布的图片
李白的手机于2021-03-14 14:07发布的图片
5
下一页