字符串算法题
在刷题的过程中,我发现几乎所有跟字符串子串有关的题,我全都不会,因此以后会在这篇下面,总结与字符串有关的算法题。
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;
}