LeetCode 面试题 01.06. 字符串压缩
面试题 01.06. 字符串压缩
题目来源:https://leetcode-cn.com/problems/compress-string-lcci
题目
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
示例1:
输入:"aabcccccaaa"
输出:"a2b1c5a3"
示例2:
输入:"abbccd"
输出:"abbccd"
解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。
提示:
- 字符串长度在[0, 50000]范围内。
解题思路
思路:双指针
定义双指针,其中一个指针 i
用于固定起始位置,另外一个指针 j
用于移动。
移动指针的过程中,所指元素若与固定指针指向的元素相同时,继续移动;当元素不同时,先记下元素出现的次数,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 方法。这个方法,在下面的文章中,简单提及过:
这里再简单介绍下: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 方法来解决这个问题的方案。
欢迎关注微信公众号《书所集录》
推荐阅读
-
Leetcode刷题记录——面试题48. 最长不含重复字符的子字符串
-
【leetcode 简单】 第一百题 压缩字符串
-
LeetCode题解 => 443.压缩字符串(七十六)
-
leetcode 443.压缩字符串
-
【LeetCode】周赛纪录(八)第199场周赛20200726 重新排列字符串 灯泡开关 IV 好叶子节点对的数量 压缩字符串 II
-
LeetCode 面试题 01.06. 字符串压缩
-
leetcode | 面试题58 - II. 左旋转字符串
-
leetcode面试题58 - II. 左旋转字符串(一行解决)
-
【leetcode 简单】 第一百题 压缩字符串
-
面试题 01.06. 字符串压缩