【第 199 场周赛 阿里云】【LeeCode 困难 python3】5462. 压缩字符串 II

想要看更加舒服的排版、更加准时的推送
关注公众号“不太灵光的程序员”
每日八点有干货推送,微信随时解答你的疑问

  1. 压缩字符串 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)

你可能感兴趣的:(面试题,LeeCode,Python3,字符串,python,正则表达式,算法,leetcode)