classSolution { public: int dp[105][105]; int n; intdfs(int st, int k, string& s){ if (st == n) return0; int& r = dp[st][k]; if (r != -1) return r; if (k) r = dfs(st + 1, k - 1, s); // case1: 删除当前位置字符
// case2: 保留当前字符,并枚举该字符连续的长度(所以遇到不同字符必须删除,才能维护其连续性) int c = 1; // 记录当前字符的连续个数 for (int i = st + 1; i <= n; i++) { int t = dfs(i, k, s) + 1 + (c >= 100 ? 3 : c >= 10 ? 2 : c > 1 ? 1 : 0); if (r == -1 || r > t) r = t; if (i == n) break; if (s[i] == s[st]) c++; // 相同, 个数加1 elseif (k-- <= 0) break; // 否则删除不同的字符 } return r; } intgetLengthOfOptimalCompression(string s, int k){ n = s.size(); memset(dp, -1, sizeof dp); dfs(0, k, s); return dp[0][k]; } };