与Leetcode394:字符串解码题目类似,链接如下:
https://leetcode-cn.com/problems/decode-string/
本题题目描述如下:
大写字母压缩规则如下: AAAB可以压缩为A3B(单字符压缩不加括号) ABABA可以压缩为(AB)2A,(多字符串压缩才加括号) 输入数据保证不会出现冗余括号,且表示重复的数字一定合法且大于1,
即不会出现下列情况:
(A)2B---应该为A2B,
((AB))2C---应该为(AB)2C,
(A)B---应该为AB, A1B,
(AB)1C---应该为ABC
另外数字可能出现多位数即A11B或者(AB)10C或者A02这种情况 A11B = AAAAAAAAAAAB, A02=AA
Python代码如下:
class Solution:
def decodeString(self, s: str) -> str:
if not s or s == "":
return ""
return self.helper(s, 1)
def helper(self, ss, n):
i = 0
length = len(ss)
result = ""
while i < length:
# 从左往右扫面的过程中,只会遇到两种情况:情况一:是"(",情况二:是字母
# 处理情况一:"("
if ss[i] == "(": # 需要用到递归
temp = ""
num = ""
t = []
i += 1
while i < length:
if ss[i] == "(":
t.append("(")
temp += ss[i]
elif ss[i] == ")":
if t == []:
i += 1
break
else:
t.pop()
temp += ss[i]
else:
temp += ss[i]
i += 1
while i < length:
if "0" <= ss[i] <= "9":
num += ss[i]
else:
break
i += 1
result += self.helper(temp, int(num))
# 处理情况二:遇到字母
else:
temp = ""
num = ""
while i < length:
if "A" <= ss[i] <= "Z":
temp += ss[i]
i += 1
else:
break
while i < length:
if "0" <= ss[i] <= "9":
num += ss[i]
i += 1
else:
break
if num == "":
result += temp
else:
result += temp[:-1] + temp[-1] * int(num)
return result * n
输入输出如下(自己整理后的形式):
num = 5
data = ["A11B", "(AA)2A", "((A2B)2)2G", "(YUANFUDAO)2JIAYOU", "A2BC4D2"]
ans = ["AAAAAAAAAAAB", "AAAAA", "AABAABAABAABG", "YUANFUDAOYUANFUDAOJIAYOU", "AABCCCCDD"]
for i in range(5):
print(Solution().decodeString(data[i]) == ans[i])
运行结果如下: