csp信奥赛C++高频考点专项训练之字符串 --【字符串基础】:[蓝桥杯青少年组国赛 2025] 第一题
csp信奥赛C++高频考点专项训练之字符串 --【字符串基础】:[蓝桥杯青少年组国赛 2025] 第一题
题目描述
给你两个字符串S SS和T TT。你需要找出S SS中有多少个连续子串,能够与字符串T TT相匹配。
匹配规则如下:
- 进行匹配的S SS的子串,其长度必须与T TT的长度完全相同。
- 对于字符串T TT中的
?字符,它可以匹配S SS子串中对应位置的任意字符。 - 对于字符串T TT中的字母(
a, b, A, B),它可以与S SS子串中对应位置的字母进行对应字母但是大小写不同的匹配。例如,a可以匹配A(但是不能匹配a),B可以匹配b。
请你计算出S SS中总共有多少个这样的匹配子串。
输入格式
输入两行。
第一行输入字符串S SS,保证只包含a,b,A,B这四种字符。
第二行输入字符串T TT,保证只包含a,b,A,B,?这五种字符。
输出格式
输出一个整数,表示S SS中能与T TT匹配的子串数量。
输入输出样例 #1
输入 #1
AabAaBAAbb a?B输出 #1
3说明/提示
对于100 % 100\%100%的数据,1 ≤ ∣ T ∣ ≤ ∣ S ∣ ≤ 1000 1 \le |T| \le |S| \le 10001≤∣T∣≤∣S∣≤1000。
思路分析
本题要求统计字符串S中所有长度等于T的连续子串,满足自定义的匹配规则:
T中的?可以匹配S子串中的任意字符(a, b, A, B)。T中的字母只能匹配S中对应位置大小写相反的同一字母。例如a只能匹配A,A只能匹配a,b和B同理。
数据范围很小(|S|,|T| ≤ 1000),因此可以直接枚举S的所有起始位置i,检查以i开始、长度为|T|的子串是否与T匹配。检查时逐字符比较,时间复杂度 O(|S|·|T|),完全可行。
匹配判断函数:对于第j个字符(0‑based),如果T[j] == '?'则直接通过;否则要求S[i+j]与T[j]字母相同(忽略大小写)且大小写相反(即字符不相等)。利用tolower或直接枚举四种对应关系均可。
统计满足条件的子串个数并输出。
代码实现
#include<bits/stdc++.h>usingnamespacestd;// 判断字符c1和c2是否满足匹配规则boolmatch(charc1,charc2){if(c2=='?')returntrue;// ? 匹配任意// 字母必须相同(忽略大小写)且大小写相反returntolower(c1)==tolower(c2)&&c1!=c2;}intmain(){string s,t;cin>>s>>t;intn=s.size(),m=t.size(),ans=0;for(inti=0;i<=n-m;++i){// 枚举所有起始位置boolok=true;for(intj=0;j<m;++j){// 逐字符比较if(!match(s[i+j],t[j])){ok=false;break;}}if(ok)++ans;}cout<<ans<<endl;return0;}功能分析
- 输入处理:读取字符串
S和T,长度分别记为n和m。 - 外层循环:遍历
S中所有可能的子串起始位置i(0到n-m)。 - 内层匹配:对于每个起始位置,逐位检查
S[i+j]与T[j]是否符合规则:- 若
T[j]为?,则任意字符都合法。 - 否则要求两个字符字母相同(忽略大小写)且大小写不同(例如
a与A,b与B)。
- 若
- 计数输出:每找到一个完整匹配的子串,计数器加一,最后输出结果。
【完整系列请查看专栏】:
信奥赛C++普及组CSP-J一等奖通关刷题题单及题解:
https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转
各种学习资料,助力大家一站式学习和提升!!!
#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"########## 一站式掌握信奥赛知识! ##########";cout<<"############# 冲刺信奥赛拿奖! #############";cout<<"###### 课程购买后永久学习,不受限制! ######";return0;}【秘籍汇总】(完整csp信奥赛C++学习资料):
1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):
https://edu.csdn.net/lecturer/7901 点击跳转
2、CSP信奥赛C++竞赛拿奖视频课:
https://edu.csdn.net/course/detail/40437 点击跳转
https://edu.csdn.net/course/detail/41081 点击跳转
3、csp信奥赛高频考点知识详解及案例实践:
CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转
CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转
信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html 点击跳转
4、csp信奥赛冲刺一等奖有效刷题题解:
信奥赛C++普及组CSP-J一等奖通关刷题题单及题解:
https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转
信奥赛C++提高组csp-j初赛&复赛真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转
信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13125089.html 点击跳转
5、GESP C++考级真题题解:
GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转
GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转
GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html 点击跳转
· 文末祝福 ·
#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"跟着王老师一起学习信奥赛C++";cout<<" 成就更好的自己! ";cout<<" csp信奥赛一等奖属于你! ";return0;}