第二题,我一眼就知道是二分了,但是我***兮兮的把l=m+1,r=m-1写成了l=l+1;r=r-1;关键是列子并不能给我错误提示,害得我想了半天都写不对,气死啦
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * @param x string字符串 * @return int整型 */ int check(int x,string s) //假如x=2,字符串为aacbbcba我们只需要看字符串里面是不是含有aabbcc, // 当然得按顺序来,显然当前字符串不满足。那么x=2,大了,缩小枚举范围 { int k=3*x; int a=0; int b=0; int c=0; int i=0; while(i<s.length()) { if(s[i]=='a') a++; i++; if(a==x) break; } while(i<s.length()) { if(s[i]=='b') b++; i++; if(b==x) break; } while(i<s.length()) { if(s[i]=='c') c++; i++; if(c==x) break; } if(a+b+c>=k) return 1; return 0; } int Maximumlength(string x) { int n = x.size(); int l = 0,r = n;//枚举的上下界 while(l<=r){ int m=(l+r)>>1; if(check(m,x)){ l = m+1;//当前枚举的值满足条件,那么我们就试探着看,能不能找到更大的值 } else r = m-1;//否则看小的值能不能满足 } return 3*(l-1); } };