题目:字符串“aaaabcccaa”,编码后位变为“4a1b3c2a”。解码则是“3e4f2e”,解码后位”eeefffee“
分析:基本思路是遍历字符串,然后统计字符出现的次数,再把出现的次数和字符组合在一起。代码不难,但是容易再边界条件上出错。无论是编码还是解码,算法都需要把字符串中的每个字符遍历一次,如果字符串的长度为n,那么算法的时间复杂度为O(n),在编码和解码过程中,代码需要分配一个数组来容纳编码或解码后的字符串,一次空间复杂度为O(n).
code
(1)
def RLEncode(s):
encodeStr = []
last = s[0]
count = 0
for i in range(len(s)):
# 遍历每个字符,统计它连续出现的次数
if s[i] == last:
count += 1
else:
encodeStr.append(str(count))
encodeStr.append(last)
count = 1
last = s[i]
# 统计最后一个字符及其出现次数,这是容易忽略的边界条件
encodeStr.append(str(count))
encodeStr.append(last)
return ''.join(encodeStr)
if __name__ == "__main__":
s = 'aaabcccaa'
print(RLEncode(s))
(2)解码。
def RLEDecode(s):
decodeStr = []
i = 0
digitCount = 0
while i < len(s):
# 统计数字字符的个数,它们表示后面字符要出现的次数
if s[i].isdigit() is True:
digitCount += 1
i += 1
else:
# 把把数字字符转换为数字
count = int(s[i - digitCount:i])
c = s[i]
# 根据次数添加字符
for j in range(count):
decodeStr.append(c)
i += 1
digitCount = 0
return ''.join(decodeStr)
if __name__ == "__main__":
s = "11a1b3c2a"
print(RLEDecode(s))
网友评论