做完题之后讲解了一个双指针的方法(O(N)), 万分受教
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param x string字符串
* @return int整型
*/
int Maximumlength(string x) {
int n = x.size(), ans = 0;
vector<int> a, c, b(n+1);
for(int i = 0; i < n; ++i){
b[i+1] = b[i];
switch(x[i]){
case 'a':
a.emplace_back(i);
break;
case 'b':
++b[i+1];
break;
case 'c':
c.emplace_back(i);
}
}
reverse(c.begin(), c.end());
for(int i = 0, l = min(c.size(), a.size()); i < l; ++i, ++ans)
if(c[i] < a[i] || b[c[i] + 1] - b[a[i]] < i + 1) break; //c 跑到了 a 的后面 或者 B的数量不足了
return ans*3;
}
};------------------------手动分割线----------------------------
二分法:
两种二分的写法
左闭右开
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param x string字符串
* @return int整型
*/
int Maximumlength(string x) {// 二分法
int l = 0, r = (x.size()/3) + 1, len = x.size();
while(l < r){
int m = (l + r) >> 1, a = m, b = m, c = m;
for(int i = 0; i < len; ++i){
if(a>0){
if(x[i] =='a') --a;
}
else if(b>0){
if(x[i] =='b') --b;
}
else if(c>0){
if(x[i] =='c') --c;
}
else break;
}
if(a +b +c > 0) r = m;
else l = m + 1;
}
return (r-1)*3;
}
};
左闭右闭
class Solution {
public:
int Maximumlength(string x) {
int l = 0, r = x.size()/3 , len = x.size(); // 二分法
while(l <= r){
int m = (l + r) >> 1, a = m, b = m, c = m;
for(int i = 0; i < len; ++i){
if(a>0){
if(x[i] =='a') --a;
}
else if(b>0){
if(x[i] =='b') --b;
}
else if(c>0){
if(x[i] =='c') --c;
}
else break;
}
if(a +b +c > 0) r = m - 1;
else l = m + 1;
}
return (r)*3;
}
};
京公网安备 11010502036488号