5462. 压缩字符串 II
大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在CSDN中写博客,唯一博客更新的地址为:亓官劼的博客
本文原创为亓官劼,请大家支持原创,部分平台一直在恶意盗取博主的文章!!!
行程长度编码 是一种常用的字符串压缩方法,它将连续的相同字符(重复 2 次或更多次)替换为字符和表示字符计数的数字(行程长度)。例如,用此方法压缩字符串 "aabccc"
,将 "aa"
替换为 "a2"
,"ccc"
替换为"c3"
。因此压缩后的字符串变为
“a2bc3”` 。
注意,本问题中,压缩时没有在单个字符后附加计数 '1'
。
给你一个字符串 s
和一个整数 k
。你需要从字符串 s
中删除最多 k
个字符,以使 s
的行程长度编码长度最小。
请你返回删除最多 k
个字符后,s
行程长度编码的最小长度 。
示例 1:
输入:s = "aaabcccd", k = 2
输出:4
解释:在不删除任何内容的情况下,压缩后的字符串是 "a3bc3d" ,长度为 6 。最优的方案是删除 'b' 和 'd',这样一来,压缩后的字符串为 "a3c3" ,长度是 4 。
示例 2:
输入:s = "aabbaa", k = 2
输出:2
解释:如果删去两个 'b' 字符,那么压缩后的字符串是长度为 2 的 "a4" 。
示例 3:
输入:s = "aaaaaaaaaaa", k = 0
输出:3
解释:由于 k 等于 0 ,不能删去任何字符。压缩后的字符串是 "a11" ,长度为 3 。
提示:
1 <= s.length <= 100
0 <= k <= s.length
s
仅包含小写英文字母
5462. 压缩字符串 II 题解
class Solution {
int f[101][101][27];
public:
int getlen(int x) {
if (x == 1)
return 0;
if (x == 100)
return 3;
if (x < 10)
return 1;
return 2;
}
int getLengthOfOptimalCompression(string s, int k) {
int len = s.length();
if (k >= len)
return 0;
int ans = len, m = len-k;
// 初始化
for (int i = 0; i <= len; ++i)
for (int j = 0; j <= len; ++j)
for (int t = 0; t < 26; ++t)
f[i][j][t] = INT_MAX / 2;
for (int t = 0; t < 26; ++t)
f[0][0][t] = 0;
for (int i = 1; i <= len; ++i) {
for (int j = 1; j <= i; ++j) {
for (int t = 0; t < 26; ++t) {
f[i][j][t] = f[i-1][j][t];
if (t == s[i-1] - 'a') {
int count = 0;
for (int p = i-1; p >= 0; --p) {
if (s[p] == s[i-1])
++count;
if (count > j || p < j-count)
break;
if (count == j) {
f[i][j][t] = min(f[i][j][t], 1 + getlen(count));
continue;
}
for (int q = 0; q < 26; ++q)
if (q != t) {
f[i][j][t] = min(f[i][j][t], f[p][j-count][q] + 1 + getlen(count));
}
}
}
if (j >= m)
ans = min(ans, f[i][j][t]);
}
}
}
return ans;
}
};