Dynamic Programming学习笔记 (50) - 使绳子变成彩色的最短时间 (力扣# 1578)

266 阅读1分钟

本题出自力扣题库第1578题。题面大意如下:

n个气球排列在一根绳子上。colors是一个下标从0开始的字符串,其中colors[i]是第i个气球的颜色。

另有一个下标从0开始的整数数组neededTime,其中 neededTime[i]是从绳子上移除第i个气球需要的时间。

要求从绳子上移除一些气球使得没有两个连续的气球涂着相同的颜色

问所需的最少时间为多少

示例:

ballon1.jpg

输入:colors = "abaac", neededTime = [1,2,3,4,5]
输出:3
解释:在上图中,'a' 是蓝色,'b' 是红色且 'c' 是绿色。
移除下标2的蓝色气球。这将花费 3 秒。
移除后,不存在两个连续的气球涂着相同的颜色。总时间 = 3

题解:

对本题而言,一般的递归加DP方法并不是最优的解法。以下是一种O(N)的算法:对字符串中各个字符按数组下标顺序依次循环,对某个下标i,如果与前一个字符相同,那么所需的时间增加neededTime[i-1]和neededTime[i]中较小的一个,并且将neededTime[i]更新为neededTime[i-1]和neededTime[i]中较大的一个以用于下一次的比较。

Java代码如下:

class Solution {
    public int minCost(String colors, int[] neededTime) {
        int result = 0;

        char[] chars = colors.toCharArray();
        int N = neededTime.length;

        for(int i = 1; i < N; i++){
            if(chars[i] == chars[i-1]){
                result += Math.min(neededTime[i-1], neededTime[i]);
                neededTime[i] = Math.max(neededTime[i-1], neededTime[i]);
            }
        }
        return result;
    }
}