P1321 单词覆盖还原
解题思路
这道题目需要我们统计一个字符串中出现的"boy"和"girl"单词的数量。由于这些单词可能被部分覆盖,所以不能简单地查找完整单词,而要识别出每个字符属于哪个单词。
方法思路
-
字符识别:遍历字符串中的每个字符,判断它属于"boy"还是"girl"单词的一部分。
-
独立计数:
-
对于"boy":'b'一定是一个新"boy"的开始,'o'如果前一个字符不是'b'则视为新"boy"的一部分,'y'同理。
-
对于"girl":'g'一定是一个新"girl"的开始,后续字符'i'、'r'、'l'如果不符合连续顺序,则视为新"girl"的一部分。
-
-
输出结果:分别输出"boy"和"girl"的计数结果。
#include<bits/stdc++.h> using namespace std; const int N = 1e3 + 10; // 定义数组最大长度 int vis[N]; // 未使用的标记数组 int ans1, ans2; // ans1统计boy数量,ans2统计girl数量 int main() { string s; cin >> s; // 输入字符串 for(int i = 0; i < s.size(); i++) // 遍历字符串 { // 统计boy数量 if(s[i] == 'b') ans1++; // 遇到b一定是新boy的开始 else if(s[i] == 'o' && s[i - 1] != 'b') ans1++; // o前不是b则视为新boy else if(s[i] == 'y' && s[i - 1] != 'o') ans1++; // y前不是o则视为新boy // 统计girl数量 if(s[i] == 'g') ans2++; // 遇到g一定是新girl的开始 else if(s[i] == 'i' && s[i - 1] != 'g') ans2++; // i前不是g则视为新girl else if(s[i] == 'r' && s[i - 1] != 'i') ans2++; // r前不是i则视为新girl else if(s[i] == 'l' && s[i - 1] != 'r') ans2++; // l前不是r则视为新girl } cout << ans1 << endl << ans2 << endl; // 输出结果 return 0; }
代码解释
-
输入处理:读取输入的字符串。
-
遍历字符串:逐个字符检查是否属于"boy"或"girl"的一部分。
-
boy计数:
-
'b'字符总是表示一个新"boy"的开始。
-
'o'字符如果前面不是'b',则表示一个新"boy"的一部分。
-
'y'字符如果前面不是'o',同样表示一个新"boy"的一部分。
-
-
girl计数:
-
'g'字符总是表示一个新"girl"的开始。
-
'i'、'r'、'l'字符如果前面不是预期的前一个字符,则表示一个新"girl"的一部分。
-
-
输出结果:分别输出"boy"和"girl"的计数结果。
这种方法有效地处理了单词被部分覆盖的情况,确保每个字符都被正确归类统计。时间复杂度为O(n),其中n是字符串长度,适用于题目给定的数据范围。

浙公网安备 33010602011771号