📌  相关文章
📜  可被K整除的子字符串的计数(1)

📅  最后修改于: 2023-12-03 14:50:39.003000             🧑  作者: Mango

可被 K 整除的子字符串计数

题目描述

给定一个仅由数字 0-9 组成的字符串 S ,求出其中任意一个长度为 K 的连续子串可以被整除的子串个数。

示例
输入:S = "10203", K = 1
输出:5
解释:有 5 个可被整除的子串: 1, 0, 2, 0, 3。

输入:S = "1234567890", K = 5
输出:6
解释:有 6 个可被整除的子串: 12345, 23456, 34567, 45678, 56789, 7890。
解法

一道有点难度的题目,主要思路是通过枚举子串,将其转化为数字再判断是否能被 K 整除。

通过枚举子串,我们可以得到所有长度为 K 的连续子串。而题目中要求的是任意一个长度为 K 的连续子串可以被整除的子串个数,也就是说,每个长度为 K 的连续子串都需要被考虑到。

接着,我们将这些子串转化为数字,并计算它们的余数,然后再判断是否为 0。具体地,我们可以从高位到低位一个一个地计算出它们的数字值,并对 K 取余数,判断这个余数是否为 0。

至此,我们就完成了这道题目。

代码

以下是 Python 代码:

def count_substrings(s: str, k: int) -> int:
    """
    计算可被 K 整除的子串个数
    """
    if not s or k <= 0:
        return 0

    count = 0
    for i in range(len(s) - k + 1):
        # 将子串转化为数字
        num = int(s[i:i+k])
        # 如果被 K 整除,则计数器加 1
        if num % k == 0:
            count += 1

    return count
复杂度分析
  • 时间复杂度:$O(nk)$,其中 $n$ 是字符串的长度。
  • 空间复杂度:$O(1)$。