📌  相关文章
📜  二进制字符串的 K 大小子字符串中的最大设置位数计数(1)

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

二进制字符串的 K 大小子字符串中的最大设置位数计数

在计算机科学中,我们经常需要在二进制字符串中进行操作。这个题目里要求我们找到二进制字符串的所有K大小的子字符串最大设置位数。

算法思想

这道题的解法是利用滑动窗口算法,具体的思路是:首先用一个哈希表来保存窗口中数字出现的次数(也就是窗口中每个字符 1 的个数),当窗口的大小超过了K之后,我们就需要将窗口的最左边的数字删除,同时更新哈希表。同时我们还需要用一个计数器来记录我们当前窗口中最大的 1 的个数。

当我们遍历完整个二进制字符串之后,就能够得到最终的答案了。

时间复杂度:O(N),空间复杂度:O(1)

代码实现
def count_max_set_bits(s: str, k: int) -> int:
    if not s or k == 0:
        return 0

    left = right = 0
    hash_map = dict()
    max_bits = 0

    while right < len(s):
        c = s[right]
        hash_map[c] = hash_map.get(c, 0) + 1
        right += 1

        while right - left > k:
            c = s[left]
            hash_map[c] -= 1
            if hash_map[c] == 0:
                hash_map.pop(c)
            left += 1

        max_bits = max(max_bits, sum(hash_map.values()))

    return max_bits
测试样例

| 输入 | 输出 | | ---- | ---- | | s = "00110", k = 2 | 2 | | s = "00110", k = 3 | 2 | | s = "11101", k = 2 | 3 | | s = "00000", k = 2 | 0 |

总结

这道题目主要考察了滑动窗口算法的应用,并且在实现时需要注意边界情况的处理。需要注意的是,在窗口大小等于K的时候需要执行一次计数器更新操作的,因为max_bits初始值为0。