P8195 [传智杯 #4 决赛] 小智的疑惑

91 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情

[传智杯 #4 决赛] 小智的疑惑

题目描述

传智专修学院给了小智一个仅包含小写字母的字符串 ss,他想知道,里面出现了多少次子串 chuanzhi 呢。

我们称一个字符串 ttss 的子串,当且仅当将 ss 的开头若干个(可以为 0 个)连续字符和结尾若干个(可以为 0 个)连续字符删去后,剩下的字符串和 tt 相同。例如,我们称 ababc 的子串,但 ac 不是 abc 的子串。

输入格式

输入只有一行一个字符串,表示字符串 ss

输出格式

输出一行一个整数表示答案。

样例 #1

样例输入 #1

welcometochuanzhicupchuanzhi

样例输出 #1

2

提示

数据规模与约定

对于全部的测试点,保证 1s4×1051 \leq |s| \leq 4 \times 10^5s|s| 表示 ss 的长度,且 ss 中只有小写字母。

思路分析

刚开始一看题目,题意非常的简单容易理解,但是会发现一个问题,查找子串会很麻烦,那么有没有什么封装好的东西来帮助我们来实现这些东西呢?
毫无疑问是有的,这就要讲到STL容器中封装的string容器了

string的使用

string的使用只要在前面编译的#那块加上以下代码即可

#include<string>

string的find函数

string中的查找函数非常的好用
find函数的形参是一个字符串,返回值是一个整数,对于这个整数很有讲究

  • 如果在字符串中找到了子串,那么pos返回值就是子串开头的字符串索引下标
  • 如果未找到子串,返回值是-1

string的替换函数

使用方式:s.replace(int a,int b,string str);

  • a:此参数是替换的起始位置
  • b:此参数是替换的长度
  • str:此参数是以a起始,b为长度的一段字符串要替换的内容

代码展示

#include<iostream>
#include<string>
using namespace std;

int main()
{
    string s;
    cin >> s;
    string str = "chuanzhi";
    int res = 0;
    int pos = s.find(str);//没找到就是-1
    while (pos != -1) {
        s.replace(pos, 8, "");
        pos = s.find(str);//没找到就是-1
        res++;
    }
    cout << res;
    return 0;
}

PS:这题可以说是比较简单的一题了~