这题因为只有三个字符,并且数据较小,很容易想到用暴力方法求解。对于每一个位置,分别插入A/B/C三种字符,然后计算分数,取最大值。
分数的计算有两种思路,对于每次遍历,计算消除的分数后,一种是把不能消除的字符用一个新的字符串记录,另一种是把要消除的用特殊符号标记,最后在原字符串的基础上进行删除。前者写起来比较容易,后者相对麻烦。我写的是后者(逃
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <bits/stdc++.h> using namespace std; string s,ts; int ans,tmp; int cal(string ss) { int cnt=0,flag=1; while(flag) { flag=0; int l=ss.length(); //cout<<ss<<endl; for(int i=0;i<l;) { if(ss[i]==ss[i+1]) { flag=1; int j; for(j=i+1;j<l;j++) { if(ss[j]!=ss[j+1]) break; } cnt+=j-i+1; for(int k=i;k<=j;k++) ss[k]='*'; i=j+1; } else i++; } //cout<<ss<<endl; string::iterator it; for(it=ss.begin();it!=ss.end();it++) { if(*it=='*') { ss.erase(it); it--; } } //cout<<ss<<endl; } return cnt; } int main() { int T; cin>>T; while(T--) { cin>>s; int l=s.length(); ans=0; for(int i=0;i<=l;i++) { ts=s; ts.insert(i,"A"); tmp=cal(ts); ans=max(ans,tmp); ts=s; ts.insert(i,"B"); tmp=cal(ts); ans=max(ans,tmp); ts=s; ts.insert(i,"C"); tmp=cal(ts); ans=max(ans,tmp); } cout<<ans<<endl; } }