想要看更加舒服的排版、更加准时的推送
关注公众号“不太灵光的程序员”
每日八点有干货推送,微信随时解答你的疑问
- 压缩字符串 II python3
困难
字符串
阿里云
行程长度编码 是一种常用的字符串压缩方法,它将连续的相同字符(重复 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 仅包含小写英文字母
class Solution:
def getLengthOfOptimalCompression(self, s: str, k: int) -> int:
def calc(x):
if x <= 1:
return x
elif x <= 9:
return 2
elif x <= 99:
return 3
else:
return 4
n = len(s)
t = n - k
dp = []
for i in range(n+1):
dp.append([100]*(t+1))
dp[n][t] = 0
for p in range(n-1, -1, -1):
for cnt in range(t+1):
# 1. 从此开始选择连续的字符
same = 0
for j in range(p, n):
same += (s[j] == s[p])
if same + cnt > t:
break
dp[p][cnt] = min(dp[p][cnt], (calc(same) + dp[j+1][cnt + same]))
# 2. 跳过该字符
dp[p][cnt] = min(dp[p][cnt], dp[p+1][cnt])
return dp[0][0]
s = Solution()
nums = "aaabcccd"
k = 2
ret = s.getLengthOfOptimalCompression(nums, k)
print(ret, ret == 4)
'a5c3d'
nums = "aaabeaacccd"
k = 2
ret = s.getLengthOfOptimalCompression(nums, k)
print(ret, ret == 5)
nums = "aaabcccc"
k = 1
ret = s.getLengthOfOptimalCompression(nums, k)
print(ret, ret == 4)
nums = "a"
k = 1
ret = s.getLengthOfOptimalCompression(nums, k)
print(ret, ret == 0)
nums = "aa"
k = 1
ret = s.getLengthOfOptimalCompression(nums, k)
print(ret, ret == 1)
nums = "aabaabbcbbbaccc"
k = 6
ret = s.getLengthOfOptimalCompression(nums, k)
print(ret, ret == 4)
nums = "acccaabaabbcbbb"
k = 6
ret = s.getLengthOfOptimalCompression(nums, k)
print(ret, ret == 4)
nums = "abc"
k = 2
ret = s.getLengthOfOptimalCompression(nums, k)
print(ret, ret == 1)