C语言/数据结构字符串题解:统计“chhc“子串权值总和——一次遍历模式匹配

问题描述

小红在玩一个字符串游戏,她发现当字符串中出现 "chhc" 这样的特殊子串时,这个子串会有一个权值。具体来说,对于字符串中的任意子串,如果该子串等于 "chhc",那么它的权值定义为子串中所有字符的ASCII码之和。现在小红有一个很长的字符串,她想知道所有 "chhc" 子串的权值总和是多少。

要求:

  1. 设计一个算法,在给定的字符串中找出所有连续子串等于 "chhc" 的起始位置,并计算这些子串的权值总和。
  2. 注意算法的时间复杂度应尽可能低,以处理大规模字符串输入。

测试样例

样例1:

输入:s = "chhcxychhc" 输出:812 解释:字符串中有两个 "chhc" 子串,第一个从索引0开始(字符'c','h','h','c'),第二个从索引6开始(字符'c','h','h','c')。每个 "chhc" 的ASCII码和为:99 + 104 + 104 + 99 = 406。总权值为406 × 2 = 812。

样例2:

输入:s = "chhchhc" 输出:812 解释:字符串中有两个 "chhc" 子串,第一个从索引0开始(字符'c','h','h','c'),第二个从索引3开始(字符'c','h','h','c')。每个子串的ASCII码和为406,总权值为406 × 2 = 812。

样例3:

输入:s = "abcchhcd" 输出:406 解释:字符串中有一个 "chhc" 子串从索引3开始(字符'c','h','h','c'),ASCII码和为99 + 104 + 104 + 99 = 406。

约束条件

  • 1 ≤ s.length ≤ 10^5
  • 字符串 s 仅由小写英文字母组成
  • "chhc" 子串可能出现多次,且可能重叠(例如 "chhchhc" 中索引0-3和3-6是两个重叠的子串)
  • 需要计算所有出现位置的权值总和

程序代码

#include <stdio.h>

#include <string.h>

int totalWeight(char* s) {

int n = strlen(s);

int total = 0;

// "chhc" 的 ASCII 码之和

int weight = 'c' + 'h' + 'h' + 'c'; // 99 + 104 + 104 + 99 = 406

for (int i = 0; i + 3 < n; i++) {

if (si == 'c' && si+1 == 'h' && si+2 == 'h' && si+3 == 'c') {

total += weight;

}

}

return total;

}

int main() {

printf("%d\n", totalWeight("chhcxychhc")); // 812

printf("%d\n", totalWeight("chhchhc")); // 812

printf("%d\n", totalWeight("abcchhcd")); // 406

return 0;

}

cpp 复制代码
#include <stdio.h>
#include <string.h>

int totalWeight(char* s) {
    int n = strlen(s);
    int total = 0;
    
    // "chhc" 的 ASCII 码之和
    int weight = 'c' + 'h' + 'h' + 'c';  // 99 + 104 + 104 + 99 = 406
    
    for (int i = 0; i + 3 < n; i++) {
        if (s[i] == 'c' && s[i+1] == 'h' && s[i+2] == 'h' && s[i+3] == 'c') {
            total += weight;
        }
    }
    
    return total;
}

int main() {
    printf("%d\n", totalWeight("chhcxychhc"));  // 812
    printf("%d\n", totalWeight("chhchhc"));      // 812
    printf("%d\n", totalWeight("abcchhcd"));     // 406
    return 0;
}

运行结果

相关推荐
java_nnnn3 小时前
LeetCode刷题滑动窗口(最大连续1的个数三+将x减到0的最小操作数)Java
算法·leetcode·职场和发展
bnmoel3 小时前
C++ 基础入门篇(六)类和对象-第三篇:运算符重载
开发语言·c++·算法·语法·运算符重载
wuyk5554 小时前
28 搜索引擎索引更新:从 LSM Tree 到布隆过滤器的高效实现
stm32·单片机·嵌入式硬件·算法
我命由我123454 小时前
LRU 缓存淘汰策略
数据结构·redis·学习·mysql·算法·缓存·学习方法
垆边人似月.4 小时前
华为题:合并区间
数据结构·c++·算法
垆边人似月.4 小时前
华为题:滑动窗口最大值
数据结构·c++·算法
2601_965742224 小时前
AI是怎么判断一家本地商家值得推荐的?云南老板看完这篇就懂了
大数据·人工智能·算法·ai·新媒体运营
小O的算法实验室4 小时前
IEEE TAES,基于DQN 辅助的集群无人机自组网约束多目标重构与优化
人工智能·算法
m0_547486665 小时前
《数据结构 (C语言)》期末试卷及答案(10套)2026版
c语言·开发语言·数据结构