3种解法 – 实现字符串压缩

3种解法 – 实现字符串压缩使用 临时变量 双指针法 Python 库函数 3 种解法 实现对字符串的压缩


题目

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

示例1:

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


解法一(临时变量)

思路:使用临时变量保存上一次的字符,用当前字符进行判断并计数,遇到新字符时重新记录,这种写法还是比较浓厚C的写法,因为临时的整型变量可能会重新申请对象。

  1. 记录首个字符,使用列表保存每次拼接的压缩字符
  2. 对当前字符判断,如果跟之前相同就计数,否则重新记录字符
  3. 将最后一个字符加入list
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
class Solution: def compressString(self, S: str) -> str: if len(S) == 0: return S tmpChar = S[0] tmpCount = 0 strLen = 0 l = list() for item in S: if item == tmpChar: tmpCount += 1 else: l.append('{}{}'.format(tmpChar,tmpCount)) tmpChar = item tmpCount = 1 strLen += len(str(tmpCount)) + 1 #最后一个字符 l.append('{}{}'.format(tmpChar,tmpCount)) strLen += len(str(tmpCount)) + 1 result = S if strLen < len(S): result = ''.join(l) return result 

解法二(快慢指针)

思路:跟解法一思路类似,做法上通过两个指针实现,慢指针始终指向字符开始位置,快指针指向相同字符的结束位置。

  1. 使用开始索引定位当前字符,一直访问字符串,直到开始位置到达字符串结尾
  2. 结束索引先到达字符串结尾时,由于开头字符还未到达,因此会进入else模块进行拼接
class Solution: def compressString(self, S: str) -> str: start, end, sLen = 0,0,len(S) result = "" tmpCount = 0 while start < sLen: if end<sLen and S[start] == S[end]: tmpCount += 1 end += 1 else: result += '{}{}'.format(S[start],tmpCount) start = end tmpCount = 0 return result if len(result) < len(S) else S 

解法三(Pythonic)

思路:利用python自身的库函数itertools.groupby进行字符串归类和统计

  1. 使用库函数获取字符串
  2. 使用三元运算返回结果
class Solution: def compressString(self, S: str) -> str: sResult = ''.join([item+str(len(list(itemStr))) for item,itemStr in itertools.groupby(S)]) return sResult if len(sResult) < len(S) else S 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228602.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午6:38
下一篇 2026年3月16日 下午6:39


相关推荐

  • 数组指针和指针数组

    数组指针和指针数组首先 理解一下数组指针和指针数组这两个名词 数组指针 和 指针数组 只要在名词中间加上 的 字 就知道中心了 数组的指针 是一个指针 什么样的指针呢 指向数组的指针 指针的数组 是一个数组 什么样的数组呢 装着指针的数组 然后 需要明确一个优先级顺序 gt gt 所以 p n 根据优先级 先看括号内 则 p 是一个指针 这个指针指向一个一维数组 数组长

    2026年3月18日
    1
  • RS232电平和TTL电平

    结论:TTL电平和RS232电平,无论是在电压范围还是在极性上(RS232是负逻辑)都有很大的不同。显然,这两种电平是不能直接相连的。为了把单片机的TTL电平转换成RS232电平,通常我们需要一个专用的转换芯片,比如SP3232。RS232是工业上常用的串口标准,无论是PLC的RS232串口模块,还是工控机的串口(COM),输出的电平都称为RS232电平。同时我们知道这些模块的内部控制单元都是…

    2022年4月17日
    53
  • 非常详细的sift算法原理解析

    非常详细的sift算法原理解析转非常详细的sift算法原理解析&amp;lt;divclass=&quot;article-info-box&quot;&amp;gt;&amp;lt;divclass=&quot;article-bar-topd-flex&quot;&amp;gt;&amp;lt;

    2022年6月15日
    31
  • 面向对象基础知识学习总结笔记2019-8-26

    面向对象基础知识学习总结笔记2019-8-26

    2021年7月11日
    91
  • Smartphone 2.0 = Phone + Service

    Smartphone 2.0 = Phone + Service

    2021年7月30日
    68
  • 睿智的目标检测37——TF2搭建SSD目标检测平台(tensorflow2)

    睿智的目标检测37——TF2搭建SSD目标检测平台(tensorflow2)睿智的目标检测 37 TF2 搭建 SSD 目标检测平台 tensorflow2 学习前言什么是 SSD 目标检测算法源码下载 SSD 实现思路一 预测部分 1 主干网络介绍 2 从特征获取预测结果 3 预测结果的解码 4 在原图上进行绘制二 训练部分 1 真实框的处理 2 利用处理完的真实框与对应图片的预测结果计算 loss 训练自己的 ssd 模型学习前言一起来看看 SSD 的 tensorflow2 实现吧 顺便训练一下自己的数据 什么是 SSD 目标检测算法 SSD 是一种非常优秀的 one stage 目标检测方法 one stage 算法就

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号