题目分析:
题目要求我们分析一个给定的字符串,统计其中出现的"警告"和"错误"次数,考察了字符串处理和模式匹配,具体规则如下:
-
警告:出现一次"wa"或者一次"aw"模式
-
错误:出现连续的"wa"或者连续的"aw"模式(至少连续两次相同模式)
解题思路:
遍历字符串,逐个检查相邻字符是否构成"wa"或"aw"。
若出现,向后检查是否连续出现相同模式。若连续出现≥2次,记为1次错误,并跳过整个连续区间;若单独出现,记为1次警告,仅跳过当前模式。
若未出现,继续判断下一个字符。
实现代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
char s[]="iawaswapwauawhawdwafwanbiopwanivgbikvblvbwawawawvolyuvgbololvolgbyolgyowagbolgawgboplwawaolgyolwaogblwaygbowawagwabwayawopwawagyowabwaowapjwapcfrtuywawacvujwawawaufttyfuftywawawatifgugbgbyguwawawawayugbigwwwytigwygwgbwyoawawgoghwaogwborgrewabouyhwabyuhowabhnwawauygbawyawuwaoawfcawaaaahwaywauwagwawefwaafmbawklawjiawihnwanhawawawawijwajiofjeriofgjrefjhwaewarwaowagwahwauwaiwarwaiwaqwarwahwaqwawwaowapfweofbwewafwahwaiwaewawwawawawawafwawawawaeiufwepfhnewfwahwajwatwafowawajtokshwawafwaiwahwafwahmgoewawawawafkfjkewnwawafiewhfwawawafjkernhawkrenwawawawafujnrheiowanwakawawawawwanoifewajrwaoawawfweojnwawawawawawawafjkwenawawferkwmpwawawawaforeijawawferhfiueorghwuwafguwegfwaghrwiufgwahweofgowaidwiweaiwwawieyiwe";
int warning=0,error=0;
int len=strlen(s);
//遍历字符串(没有i++,因为i的增加由内部逻辑控制)
for(int i=0;i<len-1;)
{
//检查当前字符和下一个字符是否是"wa"或"aw"
if((s[i]=='w'&&s[i+1]=='a')||(s[i]=='a'&&s[i+1]=='w'))
{
int count = 1;
int j = i + 2;
//检查后续是否有连续的相同模式
while (j < len - 1)
{
if ((s[j] == 'w' && s[j+1] == 'a' && s[i] == 'w' && s[i+1] == 'a') ||(s[j] == 'a' && s[j+1] == 'w' && s[i] == 'a' && s[i+1] == 'w'))
{
count++;
j += 2;
}
else
{
break;
}
}
//根据连续模式的数量判断是错误还是警告
if (count >= 2)
{
error++;
i = j;
}
else
{
warning++;
i += 2;
}
}
else
{
//当前字符不是'w'或'a',直接跳到下一个字符
i++;
}
}
printf("%d\n%d\n", warning, error);
return 0;
}