描述
在庆祝祖国母亲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;
}