BC119 小乐乐与字符串

描述

在庆祝祖国母亲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的话是不是太麻烦了,思前想后,没啥思路,于是看了眼题解,真是妙啊,我是真的佩服,“这些人怎么想到的。。。”,哎,没办法,别人家的孩子牛啊,咱就得跟着学习,那现在就上思路吧

    以样例输入1为例:

     CCHNCHN

我们可以第一遍遍历字符c的个数设为a,在接着遍历一遍h的个数,注意此时每有一个h就会有a个ch组合,设此时遍历完ch个数为b,接着继续遍历n,此时每有一个n就会有b个chn组合,遍历完成后最后的个数就是答案,思路上难点就是,将目标子集拆分化处理,每一步都有至少上一步所找的字符串个数的新的子集(但前提是字符串中至少存在一组所有的目标子集所需的字符);

#include<stdio.h>
int main(void){
    char arr[8000]={0};
    scanf("%s",&arr);
    //gets(arr);
    char* p=arr;
    long long c=0,ch=0,chn=0;
    while(*p){
        if('C'==*p){//首先扫描首字母"C",得到"C"的个数
            c++;
        }else if('H'==*p){//若扫描到下一个是"H"和之前扫描的"C"相组合为CH(只要多一个"H"结合之前的"C"则代表多了c种组合方式)
            ch+=c;
        }
        else if('N'==*p){//若扫描下一个为"N"和"CH"的组合相结合为“CHN”(只要多一个"N"结合"CH"就代表多了ch种组合方式)
            chn+=ch;
        }
        p++;
    }
    printf("%ld",chn);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值