这题一看太像双指针了,熟悉的子区间问题,但这次不太一样。熟悉的双指针模板这里是不适用的。所以本题应该用分治做。关键的点在于,如果在字符串里有一个字符,他总数小于k,那么,任何包含这个字符的子串都不满足条件。所以,咱们应该把这个字符剔除出去,这个是核心。代码如下:
class Solution:
def longestSubstring(self, s: str, k: int) -> int:
c0 = Counter(s)
if len(s) == 0: return 0
if c0.most_common(len(c0))[-1][1] >= k: return len(s)
for c in c0:
if c0[c] < k:
return max([self.longestSubstring(i, k) for i in s.split(c)])
此题不能用双指针的主要原因是,正常的双指针只需要维护一个状态,比如区间内相同字符个数,不同字符个数等,咱们可以不够就扩充,够了就停。一般往右走的够久,条件就会满足。但这个题,指针就算一直走,也不一定能满足条件。所以肯定是用不了双指针的。
双指针核心是二分:当右指针落位时,左指针可以满足二段性质,左边不满足,右边满足。
上题是可以的。具体有一些贪心的思想需要证明,但局部显而易见是正确的。
但是本题明显不行,当你右边加了一个未出现的元素时,就不可能满足了,右边怎么走都没用。特别是窗口为0时,那是寸步难行,根本没法往右走。