Skip to content

Commit 62a31ce

Browse files
authored
Update Readme.md
1 parent cde4a42 commit 62a31ce

File tree

1 file changed

+8
-3
lines changed
  • Recursion/395.Longest-Substring-with-At-Least-K-Repeating-Characters

1 file changed

+8
-3
lines changed
Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
### 395.Longest-Substring-with-At-Least-K-Repeating-Characters
22

3-
此题初看很类似于双指针的题。但细细分析,如果想贪心地找到最长的符合条件的序列,前指针必须一次性遍历到最后才行。这样就不再是一个滑动窗口了(因为一端不得不固定)。因此此题不能用双指针做
3+
此题其实并不容易。首先常规的双指针并不适用,假设我们固定左指针是第一个元素,那么右指针最远能移动到哪里呢?我们无法确定。其次,也无法用二分搜值的方法,因为满足条件的substring的长度并不一定是连续比变化的
44

5-
再想一下,如果不得不一遍把整个序列遍历完,那么我们就得到了所有字符和它出现的频次。对于那些出现次数少于k的字符,是“害群之马”,它们放在任何一个子序列中都会违反题意的。所以一个直观的想法是,将那些“害群之马”作为splitor,将原序列分割成若干子序列,然后递归调用函数本身,找到最长的有效子序列。递归的边界是,如果整个序列所有的字符频次都大于等于k,就可以返回序列的长度。
5+
#### 解法1:递归
6+
如果把整个序列遍历完,那么我们就得到了所有字符和它出现的频次。对于那些出现次数少于k的字符,是“害群之马”,它们放在任何一个子序列中都会违反题意的。所以一个直观的想法是,将那些“害群之马”作为splitor,将原序列分割成若干子序列,然后递归调用函数本身,找到最长的有效子序列。递归的边界是,如果整个序列所有的字符频次都大于等于k,就可以返回序列的长度;如果整个序列的总长度都小于k,那么就返回零。
67

8+
注意,这种写法的时间复杂度其实是o(N^2)。虽然有o(N)的分治(递归)写法,但是不是很容易想到,这里省略。
79

8-
[Leetcode Link](https://leetcode.com/problems/longest-substring-with-at-least-k-repeating-characters)
10+
#### 解法2:双指针
11+
本题其实确实有双指针的方法,但是比较特殊。那就是固定“滑窗里不同字母的个数”,这个数目m可以从1遍历到26。只要固定了左指针和区间不同字母的个数,那么我们就可以确定右指针最远的位置,然后查看区间内是否每个字母出现的频次都大于k。最后的答案就是遍历所有m时能够得到的最大滑窗长度。这种算法的时间复杂度是o(26N).
12+
13+
[Leetcode Link](https://leetcode.com/problems/longest-substring-with-at-least-k-repeating-characters)

0 commit comments

Comments
 (0)