字符串的压缩

问题:如何将一个字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。 压缩规则:
  1) 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。

   2) 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"

以上问题参考:https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/01.10.md 中的“字符串压缩”


分析:

1)遍历整个字符串,让一个变量(n)来记录重复的次数,当前字符和后一个字符比较是否相等,如果相等n就累加1。

2)如果不相等,就输出当前字符,不过输出字符前还需要判断n的值:

     a) 如果n > 1,说明在此之前有字符和当前字符重复,先输出n,再输出当前字符;

     b) 如果n=1,说明没有字符和当前字符重复,直接输出当前字符;

3)由于最后一个字符比较特殊,不能和后面的字符比较,它需要和前一个字符比较。所以,需要单独处理。

大概的思路是这样,以下代码只保证了正确性:

import sys

def compStr(str):
	n = 1
	for i in range(len(str)):
		if i < len(str)-1 and str[i]==str[i+1]:   # 如果当前字符和后一个字符相等
  			n += 1
		elif i == (len(str)-1):  # 单独处理最后一个字符
			if str[i-1] == str[i-2]: 
			    n = '%i'%n   # 将数值型转换为字符型
			    sys.stdout.write(n)  # 使用stdout标准输出是为了让输出后的每个字符紧密挨着
			    sys.stdout.write(str[i-1])
			else:
				sys.stdout.write(str[i])
		else:    # 碰到字符不相等的时候
			if n == 1:
				sys.stdout.write(str[i])
				n = 1
			else:
				n = '%i'%n
				sys.stdout.write(n)
				sys.stdout.write(str[i])
				n = 1
	print '\n'

if __name__ == '__main__':
    compStr('aabbbbbbccdadaddd')
    compStr('cccddecc')
    compStr('adef')
    compStr('pppppppppp')
输出结果:
2a6b2cdada3d

3c2dec

adef

10p



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值