题目来源:https://leetcode-cn.com/problems/compress-string-lccipython
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。好比,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你能够假设字符串中只包含大小写英文字母(a至z)。面试
示例1:bash
输入:"aabcccccaaa" 输出:"a2b1c5a3"
示例2:微信
输入:"abbccd" 输出:"abbccd" 解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。
提示:函数
思路:双指针spa
定义双指针,其中一个指针 i
用于固定起始位置,另一个指针 j
用于移动。.net
移动指针的过程当中,所指元素若与固定指针指向的元素相同时,继续移动;当元素不一样时,先记下元素出现的次数,j 指针所在的索引减去 i 指针所在的索引即为元素出现的次数 j - i重置固定指针 i
的位置为移动指针 j
所在的位置。其中约束条件为 i < len(S),j < len(S)
。指针
class Solution: def compressString(self, S: str) -> str: if not S: return "" ans = '' # 初始固定指针索引为 0 i = 0 length = len(S) while i < length: # 初始双指针在同一位置 # i 指针固定,j 指针用于移动 j = i # 元素相同时,计算 while j < length and S[j] == S[i]: j += 1 ans += S[i] + str(j - i) i = j return ans if len(ans) < length else S
还有一种方法,不过要借助 itertools 库的 groupby 方法。这个方法,在下面的文章中,简单说起过:code
这里再简单介绍下:groupby()
函数运行的机制是先扫描整个序列,同时查找连续相同值的元素序列。每次迭代返回的结果,包含一个值和一个迭代器对象,这个迭代器对象能够生产元素值所有等于上面那个值的组中全部对象。
先看下代码:
class Solution: def compressString(self, S: str) -> str: from itertools import groupby return min(S, ''.join(k + str(len(list(v))) for k, v in groupby(S)), key=len)
这里仅用 4 行代码就可以完成任务。
在这里 join() 括号里面,用生成器表达式生成元素与连续相同元素个数的序列。在这里,生成器表达式做为参数传入 join() 方法中,本来的括号能够省略。
以上就是使用双指针的方法,解决《面试题 01.06. 字符串压缩》的问题的主要内容,其中额外说起了使用 itertools 库的 groupby 方法来解决这个问题的方案。
欢迎关注微信公众号《书所集录》