问题描述
一个字符串中被反复贴有boy
和girl
两个单词,后贴上的可能覆盖已经贴上单词的一部分(没有被贴单词的部分用句点表示),最终每个单词至少有一个字符没有被覆盖,问贴了几个boy
和girl
.
输入格式
一行被反复贴上boy
和girl
两单词的字符串.
输出格式
两行,每行一个整数, 第一行为boy
的个数,第二行为girl
的个数.
样例
样例输入1
......boyogirlyy......girl.......
样例输出1
4 2
样例输入2
bboyy
样例输出2
3 0
限制与约定
字符串的长度不超过300,且仅包含如下字符:.bgilory
思路
这道模拟题的思路说简单也不简单,说难也不难。(废话,凑字数用的 乍一看肯定觉得这道题需要暴力枚举很多次。但是仔细观察你就会发现:题目中说 “每个单词至少有一个没被覆盖” ,那么我们只要在这个输入的字符串的长度内如果存在字符符合单词原本字符的位置,那么就说明此处是有一个单词的。
什么意思呢?就是捕捉到boy或girl的字母的时候,往下继续捕捉到原来单词字母的时候,“或”起来避免重复计数。其次,最后一个单词一定是完整的,利用这一点展开for循环。
如果还是不懂那我们就一起模拟一下:
if(s[i]=='b'||s[i+1]=='o'||s[i+2]=='y'){//如果此时s[i]=='b',那么这里肯定是有一个单词的,因为'b'是单词的开头
//如果此时s[i]!='b',但是s[i+1]=='o',那么说明了原来的s[i]是'b',但是被覆盖了,后面的没有被覆盖
//如果此时s[i]!='b'&&s[i+1]!='o',但是s[i+2]=='y',那么说明s[i]和s[i+1]都被覆盖了,只剩一个'o'
计数器++;
}
同理
if(s[i]=='g'||s[i+1]=='i'||s[i+2]=='r'||s[i+2]=='l'){
计数器++;
}
源代码
#include<bits/stdc++.h>
using namespace std;
int main() {
string s;
int boy=0,girl=0;//初始化
cin>>s;
for(int i=0; i<s.size(); i++) {//在输入的字符串的范围内判断
if(s[i]=='b'||s[i+1]=='o'||s[i+2]=='y') {//如果此时s[i]~s[i+2]是'boy'(含覆盖),计数器++
boy++;
}
if(s[i]=='g'||s[i+1]=='i'||s[i+2]=='r'||s[i+3]=='l') {//如果此时s[i]~s[i+3]是'girl'(含覆盖),计数器++
girl++;
}
}
cout<<boy<<"\n"<<girl;
return 0;
}
可以点个赞吗