字符串算法题(会持续更新)


在刷题的过程中,我发现几乎所有跟字符串子串有关的题,我全都不会,因此以后会在这篇下面,总结与字符串有关的算法题。

1、统计s中子串“CHN”的个数

题目描述
在庆祝祖国母亲70华诞之际,老师给小乐乐出了一个问题。大家都知道China的英文缩写是CHN,那么给你一个字符串s,你需要做的是统计s中子串“CHN”的个数。
子串的定义:存在任意下标a < b < c,那么“s[a]s[b]s[c]”就构成s的一个子串。如“ABC”的子串有“A”、“B”、“C”、“AB”、“AC”、“BC”、“ABC”。

输入描述:输入只包含大写字母的字符串s。(1 ≤ length ≤ 8000)

输出描述:输出一个整数,为字符串s中字串“CHN”的数量。

示例1
输入
CCHNCHN
输出
7

示例2
输入
CCHNCHNCHNCHN
输出
30

解题思路
由于C、H、N三个字母出现的顺序是一定的,因此
可以用三个变量c,h,re分别表示到目前为止,C、CH、CHN出现的数量。

如果出现了C,那么c++;
如果出现了H,那么h+=c,因为这是一个新的H,和所有之前存在的C,都可以组成一个新的CH;
如果出现了N,那么re+=h,因为这是一个新的N,和所有之前存在的CH,都可以组成一个新的CHN。

多么优秀的思路啊!

代码

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main(){
    string s;
    cin>>s;
    long long int c=0,h=0,re=0;
    for(long long int i=0;i<s.size();i++){
        if(s[i]=='C') c+=1;
        else if(s[i]=='H') h+=c;
        else if(s[i]=='N') re+=h;
    }
    cout<<re<<endl;
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值