题目难度: 简单

原题链接

今天继续更新程序员面试金典系列, 大家在公众号 算法精选 里回复 面试金典 就能看到该系列当前连载的所有文章了, 记得关注哦~

题目描述

字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串 aabcccccaaa 会变为 a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a 至 z)。

示例 1:

输入:"aabcccccaaa"
输出:"a2b1c5a3"

示例 2:

输入:"abbccd"
输出:"abbccd"
解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。

提示:

字符串长度在[0, 50000]范围内。

题目思考

  1. 需要维护哪些变量?

解决方案

思路

  • 分析题目, 我们只需要维护当前字符 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

大家可以在下面这些地方找到我~😊

我的知乎专栏

我的头条号

我的 CSDN

我的 Leetcode

我的牛客网博客

我的公众号: 算法精选, 欢迎大家扫码关注~😊

算法精选 - 微信扫一扫关注我