6464
6565如果有一个字符串s,在 s + s 拼接后, 不算首尾字符,如果能凑成s字符串,说明s 一定是重复子串组成。
6666
67- 如图,字符串s,图中数字为数组下标,在 s + s 拼接后, 不算首尾字符,中间凑成s字符串。
67+ 如图,字符串s,图中数字为数组下标,在 s + s 拼接后, 不算首尾字符,中间凑成s字符串。 (图中数字为数组下标)
6868
6969![ ] ( https://code-thinking-1253855093.file.myqcloud.com/pics/20240910115555.png )
7070
@@ -163,9 +163,7 @@ KMP算法中next数组为什么遇到字符不匹配的时候可以找到上一
163163
164164如果一个字符串s是由重复子串组成,那么 最长相等前后缀不包含的子串一定是字符串s的最小重复子串。
165165
166- 证明: 如果s 是由最小重复子串p组成。
167-
168- 即 s = n * p
166+ 如果s 是由最小重复子串p组成,即 s = n * p
169167
170168那么相同前后缀可以是这样:
171169
@@ -203,12 +201,14 @@ p2 = p1,p3 = p2 即: p1 = p2 = p3
203201
204202最长相等前后缀不包含的子串已经是字符串s的最小重复子串,那么字符串s一定由重复子串组成,这个不需要证明了。
205203
206- 关键是要要证明 :最长相等前后缀不包含的子串什么时候才是字符串s的最小重复子串呢。
204+ 关键是要证明 :最长相等前后缀不包含的子串什么时候才是字符串s的最小重复子串呢。
207205
208- 情况一, 最长相等前后缀不包含的子串的长度 比 字符串s的一半的长度还大,那一定不是字符串s的重复子串
206+ 情况一, 最长相等前后缀不包含的子串的长度 比 字符串s的一半的长度还大,那一定不是字符串s的重复子串,如图:
209207
210208
211209
210+ 图中:前后缀不包含的子串的长度 大于 字符串s的长度的 二分之一
211+
212212--------------
213213
214214情况二,最长相等前后缀不包含的子串的长度 可以被 字符串s的长度整除,如图:
@@ -230,7 +230,7 @@ p2 = p1,p3 = p2 即: p1 = p2 = p3
230230即 s[0]s[1] 是最小重复子串
231231
232232
233- 以上推导中,录友可能想,你怎么知道 s[0] 和 s[1] 就不相同呢? s[0] 为什么就不能使最小重复子串 。
233+ 以上推导中,录友可能想,你怎么知道 s[0] 和 s[1] 就不相同呢? s[0] 为什么就不能是最小重复子串 。
234234
235235如果 s[0] 和 s[1] 也相同,同时 s[0]s[1]与s[2]s[3]相同,s[2]s[3] 与 s[4]s[5]相同,s[4]s[5] 与 s[6]s[7] 相同,那么这个字符串就是有一个字符构成的字符串。
236236
@@ -246,7 +246,7 @@ p2 = p1,p3 = p2 即: p1 = p2 = p3
246246
247247或者说,自己举个例子,`aaaaaa`,这个字符串,他的最长相等前后缀是什么?
248248
249- 同上以上推导,最长相等前后缀不包含的子串的长度只要被 字符串s的长度整除,就是一定是最小重复子串 。
249+ 同上以上推导,最长相等前后缀不包含的子串的长度只要被 字符串s的长度整除,最长相等前后缀不包含的子串一定是最小重复子串 。
250250
251251----------------
252252
@@ -267,7 +267,7 @@ p2 = p1,p3 = p2 即: p1 = p2 = p3
267267
268268以上推导,可以得出 s[0],s[1],s[2] 与 s[3],s[4],s[5] 相同,s[3]s[4] 与 s[6]s[7]相同。
269269
270- 那么 最长相等前后缀不包含的子串的长度 不被 字符串s的长度整除 ,就不是s的重复子串
270+ 那么 最长相等前后缀不包含的子串的长度 不被 字符串s的长度整除 ,最长相等前后缀不包含的子串就不是s的重复子串
271271
272272-----------
273273
@@ -277,7 +277,7 @@ p2 = p1,p3 = p2 即: p1 = p2 = p3
277277
278278在必要条件,这个是 显而易见的,都已经假设 最长相等前后缀不包含的子串 是 s的最小重复子串了,那s必然是重复子串。
279279
280- 关键是需要证明, 字符串s的最长相等前后缀不包含的子串 什么时候才是 s最小重复子串。
280+ ** 关键是需要证明, 字符串s的最长相等前后缀不包含的子串 什么时候才是 s最小重复子串** 。
281281
282282同上我们证明了,当 最长相等前后缀不包含的子串的长度 可以被 字符串s的长度整除,那么不包含的子串 就是s的最小重复子串。
283283
@@ -312,7 +312,7 @@ next 数组记录的就是最长相同前后缀( [字符串:KMP算法精讲]
312312
3133134可以被 12(字符串的长度) 整除,所以说明有重复的子字符串(asdf)。
314314
315- ### 打码实现
315+ ### 代码实现
316316
317317C++代码如下:(这里使用了前缀表统一减一的实现方式)
318318
0 commit comments