1717. 删除子字符串的最大得分
状态:未AC
【无需额外空间】贪心算法
class Solution {
public:
int maximumGain(string s, int x, int y) {
int n = s.length();
if (x < y) {
swap(x, y);
for (int i = 0; i < n; i++) {
if (s[i] == 'a') s[i] = 'b';
else if (s[i] == 'b') s[i] = 'a';
}
}
int ret = 0;
int i = 0;
while (i < n) {
while (i < n && s[i] != 'a' && s[i] != 'b') i++;
int ca = 0, cb = 0;
while (i < n && (s[i] == 'a' || s[i] == 'b')) {
if (s[i] == 'a') {
ca++;
} else {
if (ca > 0) {
ca--;
ret += x;
} else {
cb++;
}
}
i++;
}
ret += min(ca, cb) * y;
}
return ret;
}
};
思路相同,没有字符串转换
/*
* ab -> x
* ba -> y
* 贪心的先去构建价值高的情况甲的,这样子剩下就只有可能情况乙
*/
class Solution {
public:
int maximumGain(string s, int x, int y) {
int a=0,b=0;
s+='-';
int ans=0;
for (char i:s) {
if (i=='a' || i=='b') {
if (i=='a') {
a++;
} else {
b++;
}
if (x>=y && i=='b' && a>0) {
a--;
b--;
ans+=x;
} else if (x<=y && i=='a' && b>0) {
a--;
b--;
ans+=y;
}
} else {
int cho=min(a,b);
int val=min(x,y);
ans+=cho*val;
a=b=0;
}
}
return ans;
}
};