要解决“字符串 chhc
子串权值求和”问题,我们需要计算给定字符串中所有子串中出现子串 "chhc"
的总次数。具体来说,给定一个由 'c'
和 'h'
组成的字符串 s
,我们需要遍历所有可能的子串,统计每个子串中 "chhc"
出现的次数,并将这些次数求和。
问题理解
-
子串定义:
- 子串是字符串中连续的一段字符序列。例如,字符串
"chhchhc"
的子串包括"c"
,"ch"
,"chh"
,"chhc"
,"h"
,"hh"
, 等等。
- 子串是字符串中连续的一段字符序列。例如,字符串
-
权值定义:
- 一个子串的权值是该子串中
"chhc"
出现的次数。例如,子串"chhcchhc"
中"chhc"
出现了两次,因此其权值为2
。
- 一个子串的权值是该子串中
-
任务目标:
- 计算所有可能子串的权值之和。
解题思路
为了高效地解决这个问题,我们可以采用以下方法:
-
识别所有
"chhc"
的出现位置:- 遍历字符串
s
,查找所有"chhc"
出现的起始索引i
,即满足s[i..i+3] == "chhc"
。
- 遍历字符串
-
计算每个
"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)
。
- 对于每个
-
累加所有
"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
代码解释
-
变量初始化:
n
:字符串s
的长度。total
:用于累加所有子串中"chhc"
出现的总次数。
-
遍历字符串:
- 使用循环
for i in range(n - 3)
来遍历所有可能的起始位置i
,确保s[i..i+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"
。
- 通过条件
-
计算贡献:
- 如果子串是
"chhc"
,则计算它在所有包含该子串的子串中的出现次数,公式为(i + 1) * (n - i - 3)
。 - 将这个值累加到
total
中。
- 如果子串是
-
返回结果:
- 最后返回
total
,即所有子串中"chhc"
出现的总次数。
- 最后返回
复杂度分析
- 时间复杂度:
O(n)
,其中n
是字符串的长度。我们仅需遍历一次字符串,检查每个可能的"chhc"
出现位置。 - 空间复杂度:
O(1)
,仅使用了常数级别的额外空间。
结论
通过上述方法,我们能够高效地计算出所有子串中 "chhc"
出现的总次数。该算法的时间复杂度为线性级别,适用于较长的字符串输入。