📅  最后修改于: 2023-12-03 15:28:31.476000             🧑  作者: Mango
给定一个由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)的额外空间。