1. 程式人生 > 實用技巧 >1578. 避免重複字母的最小刪除成本

1578. 避免重複字母的最小刪除成本

  方法一:動態規劃

class Solution {
public:
    int minCost(string s, vector<int>& cost) {
        int n = s.size(),INF = 1e9;
        vector<vector<int>> f(n,vector<int>(27,INF)); // f[i][j] 刪除前i個字元,最後一個為j的最小代價,j為26表示全刪完沒最後一個
        f[0][s[0]-'a'] = 0, f[0][26] = cost[0]; 
        for
(int i = 1; i < n; i++) { for(int j = 0; j < 27; j++) f[i][j] = f[i-1][j] + cost[i]; // 刪去第i個 int j = s[i] - 'a'; for(int k = 0; k < 27; k++) { // 保留第i個 if(k != j) { f[i][j] = min(f[i][j],f[i-1][k]); } } }
int res = INF; for(int i = 0; i < 27; i++) res = min(res,f[n-1][i]); return res; } };

  方法二:貪心

class Solution {
    public int minCost(String s, int[] cost) {
        int n = s.length();
        int res = 0;
        for(int i = 0; i < n - 1; i++) {
            int sum = cost[i], max = cost[i];
            
while(i < n - 1 && s.charAt(i) == s.charAt(i+1)) { sum += cost[i+1]; max = Math.max(max,cost[i+1]); i++; } res += sum - max; } return res; } }