2019 训练计划——DFS+BFS+string专题( 每天10题 ) 训练计划⑤
发布日期:2021-06-29 14:25:33 浏览次数:3 分类:技术文章

本文共 4503 字,大约阅读时间需要 15 分钟。

A


题目大意

一位英雄宣称用用户名中不同字符个数为奇数则为男性,否则为女性


题解

用set存每个字符就可以了

#include
using namespace std;set
st;const int maxn=100+10;char s[maxn];int main(){
ios::sync_with_stdio(false); cin.tie(0); cin>>s; int len=strlen(s); for(int i=0;i

B


题目大意

大写键的问题,可能意外按到了出现想不到的糟糕情况


题解

从第二个字符开始进行判断,如果全是大写字母,那么我们需要进行处理,把当前字符串全部进行转化,大写变为小写,小写变为大写

#include
using namespace std;const int maxn=100+10;char s[maxn];int main(){
cin>>s; int n=strlen(s); int ff=1; for(int i=1;i
='a'&&s[i]<='z'){
ff=0; break; } } if(!ff) cout<
<
='A'&&s[i]<='Z') s[i]=tolower(s[i]); else s[i]=toupper(s[i]); } cout<
<

C


题目大意

判断两个字符串的顺序是否相反


题解

用C++ reverse()函数 反一下 然后判断是否相等即可

#include
using namespace std;int main(){
string s1,s2; cin>>s1>>s2; reverse(s1.begin(),s1.end()); if(s1==s2) cout<<"YES"<

D


题目大意

判断字符串中大写与小写字符的个数 如果小写字母多 全变为小写 如果大写字符多 全变为大写 如果字符个数相等 也是全变为小写


题解

直接模拟

#include
using namespace std;int main(){
string s; cin>>s; int n=s.length(); int up=0,low=0; for(int i=0;i
='a'&&s[i]<='z') low++; else up++; } if(low>=up) transform(s.begin(),s.end(),s.begin(),::tolower); else transform(s.begin(),s.end(),s.begin(),::toupper); cout<
<

E


题目大意

根据字符串中A和D个数进而判断输赢


题解

不需要遍历两遍,只要求一个字符的个数即可,另一个就是n-ans

#include
using namespace std;const int maxn=1e5+10;char s[maxn];int main(){
ios::sync_with_stdio(false); cin.tie(0); int n; cin>>n; int ans=0; for(int i=0;i
>s[i]; if(s[i]=='A') ++ans; } if(ans*2>n) cout<<"Anton"<

F


题目大意

把所有WUB变成空格,如果有几个WUB连在一起,只能有一个空格,输出的开头必须是字母


题解

使用正则表达式

#include 
#include
using namespace std;int main() {
string str,str1; while(cin>>str){
str1 = regex_replace(str,regex("(WUB)+")," "); string s; s=regex_replace(str1,regex("^\\s"),""); cout<
<

/(^\s*)|(\s*$)/g表示空格开头或者空格结尾

^ 是开始

\s 是空白
* 表示0个或多个
| 是或者
$ 是结尾
g 表示全局

G


题目大意

大致意思就是告诉你n个字符串 问你最少需要多少步 能让所有字符串相同 如果不存在解决方案 直接输出 -1 即可


题解

想想KMP是怎么匹配的 与这个类似 我们可以结合STL进行解题 find函数能找出匹配成功第一个字符的下标 如果没找到 会返回 -1

注意:
我们将每个字符串多拼接一次 存起来 刚开始我是在拼接字符串里面找所有的原字符串 但是这种想法是错的 应该是将所有拼接的字符串与原字符串其中一个比较 然后取所有情况的最小值 然后很巧的就是find()函数所找到的下标正好就是我们需要移动的次数嗷~ (想想KMP算法)

#include
using namespace std;vector
vr,kmp;int n;int main(){
ios::sync_with_stdio(false); cin.tie(0); while(cin>>n){
string s; vr.clear(),kmp.clear(); for(int i=1;i<=n;i++){
cin>>s; vr.push_back(s); s+=s; kmp.push_back(s); } int ff=1; int ans=0,res=0x3f3f3f3f; for(int i=0;i

H


题目大意

给你一个字符串,长度n<=1e5,你要把其中的的某些字母换成大于等于它的任意一个字母(例如a可以换成b到z,不换也可以),使最终这个序列中从开始到最后依次包含abcdefghijklmnopqrstuvwxyz。最后输出的是经修改过后的包含a到z的原字符串


题解

从头开始找 遍历一遍 如果能形成26个字母 那么就跳出循环输出结果

#include
using namespace std;int main(){
string s; cin>>s; int n=s.length(); int ff=0,ans=0; char ch='a'; for(int i=0;i

I


题目大意

给你一段字符串,用来判断是否出现了字母表所有字母(26个) 大小写不限


题解

大小写不限的话,那么我们直接全变为小写 方便统计 我们用map记录每个字符出现的次数 然后遍历时查看是否有没有出现的字符 如果没有出现的话,那么输出NO,否则输出YES

#include
using namespace std;int n;char ch;map
mp;int main(){
cin>>n; for(int i=0;i
>ch; ch=tolower(ch); mp[ch]++; } int ff=1; for(ch='a';ff&&ch<='z';ch++){
if(!mp[ch]) ff=0; } if(ff) cout<<"YES"<

J


题目大意

给你三个字符串,这里我起名为a,b,c 然后我们需要统计a和b中所有字符出现的次数 是否和c中所有字符出现的次数相同


题解

我们可以先将a和b字符串拼接为一个大的字符串ss,然后求出ss字符串的长度与c字符串的长度进行比较 首先,如果长度不相同的话,就没有必要继续判断下去了 直接输出NO

其次,我们对ss和c字符串进行排序 然后我们可以用一个C++ 内置函数 strstr() 这个函数功能挺强的 在区域赛上一个题也是通过这个函数解的话很方便,它能判断一个串是否是另一个串的子串,然后子串是包括本身的

#include
using namespace std;const int maxn=100+10;char ss[maxn],s1[maxn],s[maxn];int main(){
cin>>ss>>s1>>s; strcat(ss,s1); int n=strlen(ss); int m=strlen(s); sort(ss,ss+n); sort(s,s+m); if(n!=m) cout<<"NO"<

最后注意,字符个数相同,排序之后不是只用判断两个串是否相等就可以了吗?直接ss==c就输出YES,否则输出NO

是不对的,对于字符数组的话,我们是不能直接判断相等,而是需要逐个比较,然而strstr正好有这个功能

不过对于string来说,简直是太简单了,因为确实是可以直接判断相等的!

而且拼接也很容易

具体代码如下:

#include
using namespace std;int main(){
string ss,s1,s; cin>>ss>>s1>>s; ss=ss+s1; sort(ss.begin(),ss.end()); sort(s.begin(),s.end()); if(ss==s) cout<<"YES"<
学如逆水行舟,不进则退

转载地址:https://chocolate.blog.csdn.net/article/details/100760325 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:C++ 解析正则表达式(regex_match + regex_search + regex_replace)【这或许是最详细的博客了~】
下一篇:codeblocks 打不开 只在任务栏显示有CB的图标

发表评论

最新留言

不错!
[***.144.177.141]2024年04月12日 10时36分02秒