看楼上楼下题解都大大的短,我就发布个长点的!。。。
这道题目其实就是一道模拟的题目,用最最简单的办法就是把s串变为s+s+s,这样子方便首尾连应,然后判断一下当前s[i]和s[j]是否相等,或者s[j]='w'的时候则可以继续下去,这里有个地方需要注意的是:一个被遇到的白色珠子可以被当做红色也可以被当做蓝色。这里强调了是被遇到,也就是说当前面全是w,而现在忽然出现了一个'b','r'都是不行的。也可以说成当当前第i个字符是'w'的时候无需模拟下去(除针对数据——如全是'w')。
============================完美分割线=============================
#include <iostream> #include <cstring> using namespace std; int main() { char s[700],c=0; int n,i,temp=0,num=0,w=0,ans=0; cin>>n>>s; memcpy(s+n,s,n);//copy for (i=0;i<n*2;i++) if (s[i]=='w') num++,w++; //如果是w,把它视为当前颜色,并计数,下面有用 else if (s[i]==c) num++,w=0;//是当前连续的颜色,计数,w清零 else //不是的话 { if (temp+num>ans) ans=temp+num;//做一次比较,记录ans temp=num-w;num=w+1;w=0;c=s[i];//连续的颜色改变,就开始用temp记录,比如wwwbrwrbww,生成wwwbrwrbwwwwwbrwrbww; // 一开始是w那么w++;在s【3】时改变temp=0;因为没别的颜色。w就看作b;b=4; //下一次颜色改变,temp=4,num=1;因为b后没有w这时连续颜色为r有w;以此类推; //这样子不断重复,其实就是过滤w,只有r,b只要求一个点左边连续的rrrbbbb呀就行在改变点 //断开就可以了;当然会有重复,比如wwwwbbbbrrrr,这是就输出n //最后的语句就是判断 } if (temp+num>ans) ans=temp+num;// cout<<(ans>n?n:ans)<<endl;// return 0; }
本文深入探讨了一种串匹配模拟算法,通过实例讲解了如何处理包含特殊字符的字符串匹配问题,特别关注了‘w’字符的灵活应用。文章提供了一份详细的代码实现,展示了如何通过复制字符串来简化边界条件处理,以及如何有效利用‘w’字符的特性进行匹配过程的优化。
491

被折叠的 条评论
为什么被折叠?



