@@ -59,7 +59,7 @@ KMP的经典思想就是:**当出现字符串不匹配时,可以记录一部
59
59
* 总结
60
60
61
61
62
- 读完本篇可以顺便,把leetcode上28 .实现strStr()题目做了。
62
+ 读完本篇可以顺便把leetcode上28 .实现strStr()题目做了。
63
63
64
64
65
65
# 什么是KMP
@@ -126,16 +126,15 @@ next数组就是一个前缀表(prefix table)。
126
126
127
127
# 最长公共前后缀?
128
128
129
- 文章中字符串的前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串;
129
+ 文章中字符串的 ** 前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串 ** 。
130
130
131
- 后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串。
131
+ ** 后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串** 。
132
132
133
- ** 正确理解什么是前缀什么是后缀很重要。 **
133
+ ** 正确理解什么是前缀什么是后缀很重要** !
134
134
135
135
那么网上清一色都说 "kmp 最长公共前后缀" 又是什么回事呢?
136
136
137
-
138
- 我查了一遍 算法导论 和 算法4里KMP的章节,都没有提到 "最长公共前后缀"这个词,也不知道从哪里来了,我理解是用"最长相等前后缀" 准确一些。
137
+ 我查了一遍 算法导论 和 算法4里KMP的章节,都没有提到 "最长公共前后缀"这个词,也不知道从哪里来了,我理解是用"最长相等前后缀" 更准确一些。
139
138
140
139
** 因为前缀表要求的就是相同前后缀的长度。**
141
140
@@ -220,7 +219,7 @@ next数组就可以是前缀表,但是很多实现都是把前缀表统一减
220
219
221
220
# 使用next数组来匹配
222
221
223
- 以下我们以前缀表统一减一之后的next数组来做演示。
222
+ ** 以下我们以前缀表统一减一之后的next数组来做演示** 。
224
223
225
224
有了next数组,就可以根据next数组来 匹配文本串s,和模式串t了。
226
225
@@ -236,7 +235,7 @@ next数组就可以是前缀表,但是很多实现都是把前缀表统一减
236
235
237
236
暴力的解法显而易见是O(n * m),所以** KMP在字符串匹配中极大的提高的搜索的效率。**
238
237
239
- 为了和 [ 字符串:KMP是时候上场了(一文读懂系列) ] ( https://mp.weixin.qq.com/s/70OXnZ4Ez29CKRrUpVJmug ) 字符串命名统一 ,方便大家理解,以下文章统称haystack为文本串, needle为模式串。
238
+ 为了和力扣题目28.实现strStr保持一致 ,方便大家理解,以下文章统称haystack为文本串, needle为模式串。
240
239
241
240
都知道使用KMP算法,一定要构造next数组。
242
241
@@ -402,7 +401,7 @@ for (int i = 0; i < s.size(); i++) { // 注意i就从0开始
402
401
}
403
402
```
404
403
405
- 此时所有逻辑的代码都已经写出来了,本题整体代码如下 :
404
+ 此时所有逻辑的代码都已经写出来了,力扣 28.实现strStr 题目的整体代码如下 :
406
405
407
406
# 前缀表统一减一 C++代码实现
408
407
@@ -448,7 +447,9 @@ public:
448
447
449
448
# 前缀表(不减一)C++实现
450
449
451
- 那么前缀表就不减一了,也不右移的,到底行不行呢?行!
450
+ 那么前缀表就不减一了,也不右移的,到底行不行呢?
451
+
452
+ **行!**
452
453
453
454
我之前说过,这仅仅是KMP算法实现上的问题,如果就直接使用前缀表可以换一种回退方式,找j=next[j-1] 来进行回退。
454
455
@@ -544,7 +545,7 @@ public:
544
545
545
546
我们介绍了什么是KMP,KMP可以解决什么问题,然后分析KMP算法里的next数组,知道了next数组就是前缀表,再分析为什么要是前缀表而不是什么其他表。
546
547
547
- 接着从给出的模式串中,我们一步一步的推导出了前缀表,得出前缀表无论是统一减一还是不同意减一得到的next数组仅仅是kmp的实现方式的不同 。
548
+ 接着从给出的模式串中,我们一步一步的推导出了前缀表,得出前缀表无论是统一减一还是不减一得到的next数组仅仅是kmp的实现方式的不同 。
548
549
549
550
其中还分析了KMP算法的时间复杂度,并且和暴力方法做了对比。
550
551
@@ -815,4 +816,4 @@ func strStr(haystack string, needle string) int {
815
816
* 作者微信:[ 程序员Carl] ( https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw )
816
817
* B站视频:[ 代码随想录] ( https://space.bilibili.com/525438321 )
817
818
* 知识星球:[ 代码随想录] ( https://mp.weixin.qq.com/s/QVF6upVMSbgvZy8lHZS3CQ )
818
- <div align =" center " ><img src =../pics/公众号.png width =450 alt= > </img ></div >
819
+ <div align =" center " ><img src =../pics/公众号.png width =450 alt= > </img ></div >
0 commit comments