刷题笔记-字符串 chhc 字串权值求和 | 豆包MarsCode AI刷题

2 阅读3分钟

www.marscode.cn/practice/vk…

要解决“字符串 chhc 子串权值求和”问题,我们需要计算给定字符串中所有子串中出现子串 "chhc" 的总次数。具体来说,给定一个由 'c''h' 组成的字符串 s,我们需要遍历所有可能的子串,统计每个子串中 "chhc" 出现的次数,并将这些次数求和。

问题理解

  1. 子串定义

    • 子串是字符串中连续的一段字符序列。例如,字符串 "chhchhc" 的子串包括 "c", "ch", "chh", "chhc", "h", "hh", 等等。
  2. 权值定义

    • 一个子串的权值是该子串中 "chhc" 出现的次数。例如,子串 "chhcchhc""chhc" 出现了两次,因此其权值为 2
  3. 任务目标

    • 计算所有可能子串的权值之和。

解题思路

为了高效地解决这个问题,我们可以采用以下方法:

  1. 识别所有 "chhc" 的出现位置

    • 遍历字符串 s,查找所有 "chhc" 出现的起始索引 i,即满足 s[i..i+3] == "chhc"
  2. 计算每个 "chhc" 出现的贡献

    • 对于每个 "chhc" 出现的位置 i,计算有多少个子串包含这个 "chhc"
    • 一个 "chhc" 出现在位置 i,意味着它位于子串的 [i, i+3] 范围内。
    • 要包含这个 "chhc",子串的起始位置 l 必须满足 0 ≤ l ≤ i,结束位置 r 必须满足 i+3 ≤ r < n,其中 n 是字符串的长度。
    • 因此,包含这个 "chhc" 的子串数量为 (i + 1) * (n - i - 3)
  3. 累加所有 "chhc" 的贡献

    • 对所有 "chhc" 出现的位置 i,累加 (i + 1) * (n - i - 3),即得到最终的权值之和。

实现代码

根据上述思路,我们可以这样解决问题:

def solution(s: str) -> int:
    n = len(s)
    total = 0

    # 遍历所有可能的起始位置 i,使得 s[i..i+3] 存在
    for i in range(n - 3):
        # 检查 s[i..i+3] 是否为 "chhc"
        if s[i] == 'c' and s[i+1] == 'h' and s[i+2] == 'h' and s[i+3] == 'c':
            # 计算这个 "chhc" 出现在多少个子串中
            count = (i + 1) * (n - i - 3)
            total += count

    return total

代码解释

  1. 变量初始化

    • n:字符串 s 的长度。
    • total:用于累加所有子串中 "chhc" 出现的总次数。
  2. 遍历字符串

    • 使用循环 for i in range(n - 3) 来遍历所有可能的起始位置 i,确保 s[i..i+3] 在字符串范围内。
  3. 检查子串是否为 "chhc"

    • 通过条件 if s[i] == 'c' and s[i+1] == 'h' and s[i+2] == 'h' and s[i+3] == 'c': 来判断子串 s[i..i+3] 是否为 "chhc"
  4. 计算贡献

    • 如果子串是 "chhc",则计算它在所有包含该子串的子串中的出现次数,公式为 (i + 1) * (n - i - 3)
    • 将这个值累加到 total 中。
  5. 返回结果

    • 最后返回 total,即所有子串中 "chhc" 出现的总次数。

复杂度分析

  • 时间复杂度O(n),其中 n 是字符串的长度。我们仅需遍历一次字符串,检查每个可能的 "chhc" 出现位置。
  • 空间复杂度O(1),仅使用了常数级别的额外空间。

结论

通过上述方法,我们能够高效地计算出所有子串中 "chhc" 出现的总次数。该算法的时间复杂度为线性级别,适用于较长的字符串输入。