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

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

题目说明:
给你一个字符串 s 和一个整数数组 cost ,其中 cost[i] 是从 s 中删除字符 i 的代价。返回使字符串任意相邻两个字母不相同的最小删除成本。请注意,删除一个字符后,删除其他字符的成本不会改变。

示例1:
输入:s = “abaac” , cost = [1,2,3,4,5]
输出:3

示例2:
输入 s = “abc” , cost = [1,2,3]
输出:0

提示

  • s中只有小写英文字母,
  • 1 <= s.length <= 10^5
  • s.length == cost.length

思路

可以采用贪心算法的思想得到最终的答案,首先判断两个字符是否相等,在两个字符相等的情况下再进行其他操作。
当两个字母相等且cost[fast] >= cost[slow]的时候,slow不用进行移动,只需移动fast。当两个字符相等且cost[fast] < cost[slow]时,slow = fast ,fast++。当连个字母不相等时,slow = fast,fast++,之所以让slow = fast,是因为slow到fast之间的元素都被删除,不能再被访问。

代码展示:

public int minCost(String s, int[] cost) {
        int res = 0,slow = 0,fast = 1;
        //res为删除的最小代价
        //slow指向慢的那个字符,fast指向快的那个字符
        char[] arr = s.toCharArray();
        while(fast < s.length()){
            if(arr[slow] == arr[fast]){
                res += Math.min(cost[slow],cost[fast]);
                if(cost[fast] >= cost[slow]){
                    slow=fast;
                }
            }else{
                slow = fast;
            }
            fast++;
        }
        return res;
    }

运行结果:

在这里插入图片描述

复杂度分析:

  • 空间复杂度:O(N)
  • 时间复杂度:O(N)

另外,有错误可以指正出来,感谢各位!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值