leetcode 395 双指针X 分治✔

这题一看太像双指针了,熟悉的子区间问题,但这次不太一样。熟悉的双指针模板这里是不适用的。所以本题应该用分治做。关键的点在于,如果在字符串里有一个字符,他总数小于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时,那是寸步难行,根本没法往右走。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值