📌  相关文章
📜  最小 K 使得每个长度至少为 K 的子串包含一个字符c(1)

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

最小 K 使得每个长度至少为 K 的子串包含一个字符c

问题描述

给定一个字符串,以及一个字符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