📌  相关文章
📜  重复K次的二进制字符串中0的最长子字符串(1)

📅  最后修改于: 2023-12-03 15:28:31.476000             🧑  作者: Mango

重复K次的二进制字符串中0的最长子字符串
问题描述

给定一个由01组成的字符串s,以及一个正整数k。你需要找到s中重复k次后出现的所有0的最长子字符串的长度。如果不存在,则返回0。

解题思路

我们可以考虑通过枚举0的左端点位置,我们可以用left数组记录每个0出现的最左下标,然后对于每个0我们枚举它能成为最长的0子串的右端点。假设这个右端点是r,则计算出[l, r]这个区间内0的个数cnt,并检验它是否为k的倍数。若非k的倍数,则r向右继续枚举;否则更新答案。我们不需要知道每个0的左断点是哪些,因为这对后续答案并不产生显式影响

代码演示
class Solution:
    def longestSubstring(self, s: str, k: int) -> int:
        n = len(s)
        left = [-1] * n
        for i in range(n):
            if i == 0:
                left[i] = i if s[i] == '0' else -1
            else:
                left[i] = left[i - 1] if s[i] == '1' else i
        res = 0
        for i in range(n):
            if s[i] == '1':
                continue
            r, cnt = i, 0
            while r < n and cnt % k == 0:
                cnt += 1 if s[r] == '0' else 0
                r += 1
            if cnt % k == 0:
                res = max(res, r - i)
        return res
复杂度分析

时间复杂度:O(n^2),最坏情况下左指针枚举n,右指针最大需要枚举n次,因此总时间复杂度为O(n^2)

空间复杂度:O(n),由于left数组占用O(n)的额外空间。