给定一组字符,使用原地算法将其压缩。
压缩后的长度必须始终小于或等于原数组长度。
数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。
在完成原地修改输入数组后,返回数组的新长度。
进阶:
你能否仅使用O(1) 空间解决问题?
示例 1:
输入:
["a","a","b","b","c","c","c"]
输出:
返回6,输入数组的前6个字符应该是:["a","2","b","2","c","3"]
说明:
"aa"被"a2"替代。"bb"被"b2"替代。"ccc"被"c3"替代。
示例 2:
输入:
["a"]
输出:
返回1,输入数组的前1个字符应该是:["a"]
说明:
没有任何字符串被替代。
示例 3:
输入:
["a","b","b","b","b","b","b","b","b","b","b","b","b"]
输出:
返回4,输入数组的前4个字符应该是:["a","b","1","2"]。
说明:
由于字符"a"不重复,所以不会被压缩。"bbbbbbbbbbbb"被“b12”替代。
注意每个数字在数组中都有它自己的位置。
注意:
所有字符都有一个ASCII值在[35, 126]区间内。
1 <= len(chars) <= 1000。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/string-compression
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路,采用双指针法。
1、设置读指针iRead=0,写指针iWrite==0
2、iRead始终指向连续相同字符的起始位置,首先将字符写入写指针指向的位置,写指针后移。
3、计算连续字符的个数
4、如果个数大于1个,将个数转化为字符串写入写指针指向的位置。
5、重置读指针iRead指向下一个连续相同字符的起始位置。
6、重复步骤2到步骤5,知道读指针指向数组末尾。
代码如下:
class Solution(object):
def compress(self, chars):
n = len(chars)
if n<=1:
return n
# 双指针法
iWrite = 0
iRead = 0
while iRead
# 获得连续相同字符的起始字符
ch = chars[iRead]
# 设置结果数组的字符
chars[iWrite] = ch
iWrite += 1
# 计算相同字符个数
i = iRead + 1
while i
i+=1
# 将个数转为字符串写入结果数组
if i-iRead>1:
for ch in str(i - iRead):
chars[iWrite] = ch
iWrite += 1
# 设置读指针
iRead = i
return iWrite