题目描述
有一种简易压缩算法:针对全部由小写英文字母组成的字符串,将其中连续超过两个相同字母的部分压缩为连续个数加该字母,其他部分保持原样不变。
例如:字符串“aaabbccccd”经过压缩成为字符串“3abb4cd”。
请您编写解压函数,根据输入的字符串,判断其是否为合法压缩过的字符串,
若输入合法则输出解压缩后的字符串,否则输出字符串“!error”来报告错误。
输入描述
输入一行,为一个ASCII字符串,长度不会超过100字符,用例保证输出的字符串长度也不会超过100字符。
输出描述
若判断输入为合法的经过压缩后的字符串,则输出压缩前的字符串;
若输入不合法,则输出字符串“**!error**”。
用例1
输入
4dff
输出
ddddff
说明
4d扩展为dddd,故解压后的字符串为ddddff。
用例2
输入
2dff
输出
!error
说明
两个d不需要压缩,故输入不合法。
用例3
输入
4d@A
输出
!error
说明
全部由小写英文字母组成的字符串压缩后不会出现特殊字符@和大写字母A,故输入不合法。
"""
在这写一下自己的想法,压缩后的字符串需要解压
在字符串中呢,可能会出现非法字符,判断报告错误不难
需要注意的是,字符串中的数字可能不止有个位数
此外,如果出现5ddd这种压缩字符串的话,按理来说业是不合理的
因为它解压后为ddddddd,解压后再次压缩则为7d
"""
def judge(c):if '0'<=c<='9':return 1elif 'a'<=c<='z':return 2else:return 3
def expend(S):result=[]i=0n=len(S)while i <n:if judge(S[i])==3:return '!error'elif judge(S[i])==1:count_str=''while i<n and judge(S[i])==1: #需要获得完整的数字count_str+=S[i]i+=1if i<n and judge(S[i])==2:count_str = int(count_str)if count_str<3:return '!error'else:result.append((count_str-1)*S[i])else:result.append(S[i])i+=1return ''.join(result)def zip(S):result = []n = len(S)count = 1for i in range(1,n):if S[i]==S[i-1]:count+=1else:if count==2:result.append(S[i-1])if count>2:result.append(str(count))result.append(S[i-1])count = 1#最后一组if count == 2:result.append(S[i - 1])if count>2:result.append(str(count))result.append(S[-1])return ''.join(result)if __name__ == '__main__':S = input()Ex_S=expend(S)if Ex_S!='!error' and len(Ex_S)!=0:#如果输入的S是纯数字的话,也是错误的Zip_s = zip(Ex_S)if Zip_s==S:print(Ex_S)else:print('!error')else:print('!error')