题目描述
一个长度为 l 的字符串中被反复贴有 boy
和 girl
两单词,后贴上的可能覆盖已贴上的单词(没有被覆盖的用句点表示),最终每个单词至少有一个字符没有被覆盖。问贴有几个 boy
几个 girl
?
输入格式
一行被被反复贴有 boy
和 girl
两单词的字符串。
输出格式
两行,两个整数。第一行为 boy
的个数,第二行为 girl
的个数。
输入输出样例
输入 #1
......boyogirlyy......girl.......
输出 #1
4
2
说明/提示
数据保证,3≤≤l≤255,字符串仅仅包含如下字符:.bgilory。
乍一看本道题感觉有一点难,但仔细琢磨一下,其实代码很简单。
大致思路:由于存在覆盖的情况,即具体单词不全,且具体单词是确定的:boy和girl。那么可以采取滑动窗口的思想,即对boy,限制窗口的大小为三个字符,且这三个字符的顺序是一定的,则对str[i]=='b',str[i+1]=='o',str[i+2]=='y三者进行“或”运算,只要三者满足其一那么结果数加一;girl同理。
具体代码如下:
#include<iostream>
using namespace std;
const int N=256;//字符串长度范围
char str[N];
int main(){
cin>>str;
int resb=0;//boy的个数
int resg=0;//girl的个数
for(int i=0;str[i];i++){//“滑动窗口”
if(str[i]=='b'||str[i+1]=='o'||str[i+2]=='y')resb++;
if(str[i]=='g'||str[i+1]=='i'||str[i+2]=='r'||str[i+3]=='l')resg++;
}
cout<<resb<<endl<<resg<<endl;
return 0;
}
(希望对你有所帮助,辛苦最后点个赞吧)