题目链接
https://ac.nowcoder.com/acm/contest/9752/B
解题思路
abc不一定要连续,但是a与a必须连续,对于b,c同理。
二分;
先把a,b,c选出来,二分题目中的n,check函数先看能不能找到n个a,再看能不能找到n个b,再找n个c,如果任意一个不行,则返回false,否则返回true。
AC代码
int n; string ss; bool check(int x) { int len=3*x,i=1,cnta=0,cntb=0,cntc=0; while(i<=n) { if(ss[i]=='a') cnta++; i++; if(cnta==x) break; } while(i<=n) { if(ss[i]=='b') cntb++; i++; if(cntb==x) break; } while(i<=n) { if(ss[i]=='c') cntc++; i++; if(cntc==x) break; } if(cnta+cntb+cntc>=len) return true; else return false; } class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param x string字符串 * @return int整型 */ int Maximumlength(string s) { // write code here ss+='.'; for(int i=0;i<s.size();i++) if(s[i]=='a' || s[i]=='b' || s[i]=='c') ss+=s[i]; n=ss.size(); int l=0,r=n; while(l<r) { int mid=l+r+1>>1; if(check(mid)) l=mid; else r=mid-1; } return l*3; } };
总结
没做出来;
顺着模拟,发现思路又错了,忽略了很多特殊情况,我好菜啊。这里的子序列就不能说明一下吗