📅  最后修改于: 2023-12-03 15:26:26.364000             🧑  作者: Mango
给定一个字符串,以及一个字符c,要求找到最小的K,使得该字符串中所有长度至少为K的子串均包含字符c。
一种可行的解决方案是二分答案。设当前猜测的答案为K,那么我们只需要判断这个字符串中是否存在一个长度为K的子串不包含字符c即可。如果存在这样的子串,那么可以继续猜测更小的K。如果不存在这样的子串,则可以猜测更大的K。
具体地,可以使用双指针维护一个长度为K的窗口,判断窗口内是否存在字符c。如果存在,则说明所有长度为K的子串均包含字符c;如果不存在,则将窗口向右移动一位,再重新判断窗口内是否存在字符c。重复这个过程直到判断完整个字符串。
由于使用了二分答案和滑动窗口这两种技巧,时间复杂度为O(logn * n),其中n为字符串长度。
def min_k(s, c):
left, right = 1, len(s)
ans = -1
while left <= right:
mid = (left + right) // 2
flag = False
for i in range(len(s) - mid + 1):
if c in s[i:i+mid]:
flag = True
break
if flag:
ans = mid
right = mid - 1
else:
left = mid + 1
return ans