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;
}

运行结果

相关推荐
软件派1 天前
生产动态数据智能风控:阈值判别、趋势预测、异常识别算法工程落地实战
前端·数据库·算法
wuminyu1 天前
JVM规范学习总结:解释器与JIT编译器如何处理JVM字节码
java·linux·c语言·jvm·c++
ZhengEnCi1 天前
模型训练完整流程:从数据准备到模型上线的 10 个关键步骤(全文可跑)
后端·算法
吞下星星的少年·-·1 天前
Div.3 CF 1131A题(排序,模拟)
算法·模拟·排序
aichitang20241 天前
代数拓扑学与现代前沿视角
考研·算法·数学建模·ai·拓扑学·高考
二本咕咕-机械转码1 天前
FreeRTOS深入解析(一)_链表与并发保护——哨兵循环链表、排序键游标、临界区与关调度
单片机·算法·链表
-银雾鸢尾-1 天前
两数之和-C++实现
c++·算法
j7~1 天前
【动态规划算法专题】动态规划五部曲实战:泰波那契数、三步问题、最小花费爬楼梯
c++·算法·动态规划·数据结构与算法
倍利福猎头公司官方账号1 天前
大企业HR如何向猎头公司清晰传达AI岗位的技术需求?
人工智能·算法·机器人·求职招聘·业界资讯