.删除子字符串的最大得分-c语言贪心算法

删除子字符串的最大得分

给你一个字符串 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;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值