1531. 壓縮字串 II(動態規劃)
阿新 • • 發佈:2020-08-20
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(intn) { if(n == 1) return 1; if(n < 10) return 2; if(n < 100) return 3; return 4; } }