5509. 避免重复字母的最小删除成本

题目描述:

给你一个字符串 s 和一个整数数组 cost ,其中 cost[i] 是从 s 中删除字符 i 的代价。

返回使字符串任意相邻两个字母不相同的最小删除成本。

请注意,删除一个字符后,删除其他字符的成本不会改变。

示例 1:

输入:s = "abaac", cost = [1,2,3,4,5]
输出:3
解释:删除字母 "a" 的成本为 3,然后得到 "abac"(字符串中相邻两个字母不相同)。

示例 2:

输入:s = "abc", cost = [1,2,3]
输出:0
解释:无需删除任何字母,因为字符串中不存在相邻两个字母相同的情况。

示例 3:

输入:s = "aabaa", cost = [1,2,3,4,1]
输出:2
解释:删除第一个和最后一个字母,得到字符串 ("aba")

提示:

s.length == cost.length
1 <= s.length, cost.length <= 10^5
1 <= cost[i] <= 10^4
s 中只含有小写英文字母

解题思路:

如果采用当遇到相同的字符删除除代价最大的字符以及字符的代价,时间复杂度耗时较长;

1)、采用的是tmp保留的每个字符的最大的价值cost
2)、ret记录的是删除字符的总代价;
3)、ret - tmp即为所求的结果 ;

代码实现:
class Solution {
public:
    int minCost(string s, vector<int>& cost) {
        int i , ret= 0 , tmp = cost.back() ;
        for (i = 0 ; i < cost.size() ; i ++) ret += cost[i] ;
        char cur = s.back();
        //tmp就是保留的代价
        for (i = s.length() - 2; i > -1 ; i --)
        {
            while (i > -1 &&cur == s[i]){
                tmp = max(cost[i] , tmp) ;
                i -- ;
            }
            if (i > -1)
            {
                ret -= tmp ;
                cur = s[i] ;
                tmp = cost[i] ;
            }
        }
        ret -= tmp ;
        return ret ;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值