题目描述
我有一个长度为 ll 的字符串,最开始时,这个字符串由 ll 个句号(.
)组成。
我在这个字符串中,将多次把 boy
或者 girl
两单词,依次贴到这个字符串中。
后贴上单词,会覆盖之前贴上的单词,或者覆盖句号。最终,每个单词至少有一个字符没有被覆盖。
请问,一共贴有几个 boy
几个 girl
?
输入格式
一行被反复贴有 boy
和 girl
两单词的字符串。
输出格式
两行,两个整数。第一行为 boy
的个数,第二行为 girl
的个数。
输入输出样例
输入 #1复制
......boyogirlyy......girl.......
输出 #1复制
4 2
说明/提示
数据保证,3≤l≤2553≤l≤255,字符串仅仅包含如下字符:.bgilory.bgilory。
---------------------------------------------------------------------------------------------------------------------------------
本题是一道第一眼居然没有思路的入门题,所以写个博客发一下.
思路就是扫一遍,如果遇到非boy或者girl的字母(比如gib),那么那个肯定是先前被覆盖的单词,再次从新位置开始扫.
注意到girl和boy是没有共同的字母的(如果有的话也出不了题),所有可以放心扫girl和boy.
ac代码:
#include<bits/stdc++.h>
using namespace std;
string boy = "boy";
string girl = "girl";
int main() {
string s;
cin>>s;
int bcnt = 0,gcnt = 0;
for(int i = 0; i<s.size();) {
if(s[i] == '.') {
i++;
continue;
}
for(int qwq = 0; qwq<boy.size(); qwq++) {
if(s[i] == boy[qwq]) {
bcnt++;
//匹配成功
while(s[i] == boy[qwq] && i < s.size() && qwq < boy.size()) {
i++;
qwq++;
}
}
}
for(int qwq = 0;qwq<girl.size(); qwq++) {
if(s[i] == girl[qwq]) {
//
gcnt++;
while(s[i] == girl[qwq] && i < s.size() && qwq < girl.size()) {
i++;
qwq++;
}
}
}
}
cout<<bcnt<<endl;
cout<<gcnt<<endl;
return 0;
}