删除子字符串的最大得分
给你一个字符串 s 和两个整数 x 和 y 。你可以执行下面两种操作任意次。
删除子字符串 "ab" 并得到 x 分。
比方说,从 "cabxbae" 删除 ab ,得到 "cxbae" 。
删除子字符串"ba" 并得到 y 分。
比方说,从 "cabxbae" 删除 ba ,得到 "cabxe" 。
请返回对 s 字符串执行上面操作若干次能得到的最大得分。
示例 1:
输入:s = “cdbcbbaaabab”, x = 4, y = 5
输出:19
解释:
- 删除 “cdbcbbaaabab” 中加粗的 “ba” ,得到 s = “cdbcbbaaab” ,加 5 分。
- 删除 “cdbcbbaaab” 中加粗的 “ab” ,得到 s = “cdbcbbaa” ,加 4 分。
- 删除 “cdbcbbaa” 中加粗的 “ba” ,得到 s = “cdbcba” ,加 5 分。
- 删除 “cdbcba” 中加粗的 “ba” ,得到 s = “cdbc” ,加 5 分。
总得分为 5 + 4 + 5 + 5 = 19 。
示例 2:
输入:s = “aabbaaxybbaabb”, x = 5, y = 4
输出:20
void strc(char *s ,int i){
while(s[i+2]!='\0'){
s[i]=s[i+2];
i++;
}
s[i]='\0';
}
int maximumGain(char * s, int x, int y){
int i=0;
int sum=0;
if(x>y){
while(s[i]!='\0'&&s[i+1]!='\0'){
// printf("%c %c",s[i],s[i+1]);
if(s[i]=='a'&&s[i+1]=='b'){
s[i]='\0';
strc(s,i);
printf("%s ",s);
if(i>=1){
i=i-2;
}
else i--;
sum=sum+x;
}
i++;
}
i=0;
while(s[i]!='\0'&&s[i+1]!='\0'){
// printf("%c %c",s[i],s[i+1]);
if(s[i]=='b'&&s[i+1]=='a'){
s[i]='\0';
strc(s,i);
if(i>=1){
i=i-2;
}
else i--;
sum=sum+y;
printf("%s ",s);
}
i++;
}
}
if(x<y){
while(s[i]!='\0'&&s[i+1]!='\0'){
// printf("%c %c",s[i],s[i+1]);
if(s[i]=='b'&&s[i+1]=='a'){
s[i]='\0';
strc(s,i);
if(i>=1){
i=i-2;
}
else i--;
sum=sum+y;
printf("%s ",s);
}
i++;
}
i=0;
while(s[i]!='\0'&&s[i+1]!='\0'){
// printf("%c %c",s[i],s[i+1]);
if(s[i]=='a'&&s[i+1]=='b'){
s[i]='\0';
strc(s,i);
printf("%s ",s);
if(i>=1){
i=i-2;
}
else i--;
sum=sum+x;
}
i++;
}
}
printf("%s ",s);
return sum;
}
上面这个时间可能不能通过,最好使用栈去解决这个问题:
代码如下:
class Solution {
public:
int maximumGain(string s, int x, int y) {
stack<char> a, b;
int num = 0;
// 处理优化(节约空间,只要写一种情况即可)
if(x > y) { //(将顺序都变为先处理 ba)
swap(x, y);
reverse(s.begin(), s.end()); //对字符串进行逆序处理
}
// 先处理 ba
for(char c : s) {
if(c != 'a') a.push(c);
else {
// 形成 ba 子字符串
if(!a.empty() && a.top() == 'b') {
a.pop();
num += y;
}
else
a.push(c);
}
}
// 再处理 ab
while(!a.empty()) {
char c = a.top();
a.pop();
if(c != 'a')
b.push(c);
else {
if(!b.empty() && b.top() == 'b') {
b.pop();
num += x;
}
else
b.push(c);
}
}
return num;
}
};