题目难度: 简单
今天继续更新程序员面试金典系列, 大家在公众号 算法精选 里回复 面试金典 就能看到该系列当前连载的所有文章了, 记得关注哦~
题目描述
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串 aabcccccaaa 会变为 a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a 至 z)。
示例 1:
输入:“aabcccccaaa”
输出:“a2b1c5a3”
示例 2:
输入:“abbccd”
输出:“abbccd”
解释:“abbccd"压缩后为"a1b2c2d1”,比原字符串长度更长。
提示:
字符串长度在[0, 50000]范围内。
题目思考
- 需要维护哪些变量?
解决方案
思路
- 分析题目, 我们只需要维护当前字符 cur 和其出现次数 cnt 即可
- 首先判断原始字符串是否为空, 不为空的话就可以将当前字符初始化为头一个字符了, 同时 cnt 初始化为 1
- 如果遍历到的字符和当前字符不同, 就把当前字符连带其次数追加到结果中, 同时重置 cur 和 cnt; 相同则 cur 不变, cnt 加 1
- 特别注意遍历结束后, 也需要将当前字符及其次数追加到结果中
- 最后若结果长度没有更短, 就用原始字符串
复杂度
- 时间复杂度 O(N): 需要遍历字符串一遍
- 空间复杂度 O(1): 只使用了几个变量
代码
class Solution:
def compressString(self, S: str) -> str:
# 简单模拟, 注意判断S是否为空, 不为空的话初始化cnt和cur为1和S[0]
# 注意循环结束后一定要加当前cnt, 注意比较前后字符串长度
if not S:
return ''
res = ''
cnt = 1
cur = S[0]
for c in S[1:]:
if c != cur:
res += cur + str(cnt)
cnt = 1
cur = c
else:
cnt += 1
res += cur + str(cnt)
return res if len(res) < len(S) else S
大家可以在下面这些地方找到我~😊
我的公众号: 算法精选, 欢迎大家扫码关注~😊