1. 程式人生 > 實用技巧 >1531. 壓縮字串 II(動態規劃)

1531. 壓縮字串 II(動態規劃)

class Solution {
    public int getLengthOfOptimalCompression(String s, int k) {
        int n = s.length();
        int[][] dp = new int[n+1][k+1]; // dp[i][j]:考慮前i個字元最多刪除j個的最小長度
        for(int[] d : dp) Arrays.fill(d,Integer.MAX_VALUE >> 1);
        dp[0][0] = 0;
        for(int i = 1; i <= n; i++) {
            
for(int j = 0; j <= k && j <= i; j++) { if(j > 0) dp[i][j] = dp[i-1][j-1]; // 情況1:刪除第i個字元 // 情況2:保留第i個字元 int same = 0, diff = 0; for(int f = i; f >= 1 && diff <= j; f--) { // 向前遍歷與第i個字元相同的字元則考慮保留 if
(s.charAt(f-1) == s.charAt(i-1)) { dp[i][j] = Math.min(dp[i][j],dp[f-1][j-diff] + calc(++same)); } else { diff++; } } } } return dp[n][k]; } public int calc(int
n) { if(n == 1) return 1; if(n < 10) return 2; if(n < 100) return 3; return 4; } }