From 202dd382d29eb34f311d5f35f001255b2b770402 Mon Sep 17 00:00:00 2001 From: jinbudaily <18336218010@163.com> Date: Wed, 19 Jul 2023 16:06:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=200459.=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E5=AD=97=E7=AC=A6=E4=B8=B2=20=E6=8E=92=E7=89=88?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- problems/0459.重复的子字符串.md | 35 ++++++++++++-------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/problems/0459.重复的子字符串.md b/problems/0459.重复的子字符串.md index e26d04ad..f99102ab 100644 --- a/problems/0459.重复的子字符串.md +++ b/problems/0459.重复的子字符串.md @@ -5,8 +5,6 @@
参与本项目,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!
- - > KMP算法还能干这个 # 459.重复的子字符串 @@ -29,9 +27,11 @@ * 输出: True * 解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。) -# 思路 +## 算法公开课 -针对本题,我录制了视频讲解:[字符串这么玩,可有点难度! | LeetCode:459.重复的子字符串](https://www.bilibili.com/video/BV1cg41127fw),结合本题解一起看,事半功倍! +**[《代码随想录》算法视频公开课](https://programmercarl.com/other/gongkaike.html):[字符串这么玩,可有点难度! | LeetCode:459.重复的子字符串](https://www.bilibili.com/video/BV1cg41127fw),相信结合视频再看本篇题解,更有助于大家对本题的理解**。 + +## 思路 暴力的解法, 就是一个for循环获取 子串的终止位置, 然后判断子串是否能重复构成字符串,又嵌套一个for循环,所以是O(n^2)的时间复杂度。 @@ -44,7 +44,7 @@ 主要讲一讲移动匹配 和 KMP两种方法。 -## 移动匹配 +### 移动匹配 当一个字符串s:abcabc,内部由重复的子串组成,那么这个字符串的结构一定是这样的: @@ -80,9 +80,9 @@ public: 如果我们做过 [28.实现strStr](https://programmercarl.com/0028.实现strStr.html) 题目的话,其实就知道,**实现一个 高效的算法来判断 一个字符串中是否出现另一个字符串是很复杂的**,这里就涉及到了KMP算法。 -## KMP +### KMP -### 为什么会使用KMP +#### 为什么会使用KMP 以下使用KMP方式讲解,强烈建议大家先把以下两个视频看了,理解KMP算法,再来看下面讲解,否则会很懵。 * [视频讲解版:帮你把KMP算法学个通透!(理论篇)](https://www.bilibili.com/video/BV1PD4y1o7nd/) @@ -105,7 +105,7 @@ KMP算法中next数组为什么遇到字符不匹配的时候可以找到上一  -### 如何找到最小重复子串 +#### 如何找到最小重复子串 这里有同学就问了,为啥一定是开头的ab呢。 其实最关键还是要理解 最长相等前后缀,如图: @@ -123,7 +123,7 @@ KMP算法中next数组为什么遇到字符不匹配的时候可以找到上一 正是因为 最长相等前后缀的规则,当一个字符串由重复子串组成的,最长相等前后缀不包含的子串就是最小重复子串。 -### 简单推理 +#### 简单推理 这里再给出一个数学推导,就容易理解很多。 @@ -229,7 +229,7 @@ public: ## 其他语言版本 -Java: +### Java: ```java class Solution { @@ -261,8 +261,7 @@ class Solution { } ``` - -Python: +### Python: (版本一) 前缀表 减一 ```python @@ -346,8 +345,7 @@ class Solution: return False ``` - -Go: +### Go: 这里使用了前缀表统一减一的实现方式 @@ -405,7 +403,7 @@ func repeatedSubstringPattern(s string) bool { } ``` -JavaScript版本 +### JavaScript: > 前缀表统一减一 @@ -479,7 +477,7 @@ var repeatedSubstringPattern = function (s) { }; ``` -TypeScript: +### TypeScript: > 前缀表统一减一 @@ -539,8 +537,7 @@ function repeatedSubstringPattern(s: string): boolean { }; ``` - -Swift: +### Swift: > 前缀表统一减一 ```swift @@ -623,7 +620,7 @@ Swift: } ``` -Rust: +### Rust: >前缀表统一不减一 ```Rust