1 题目
2 思想
(1)字符串可以嵌套,所以要从最里面开始解码
(2)使用栈解决这个问题。一个是数字栈,一个是字母栈
需要注意的地方:
- a) 判断一个字符是否是数字字符? => 可以使用
isdigit()
方法 - b) 可能数字是一个多位数,需要注意
- c)python中循环的变量好像是无法更改的。
代码
class Solution:
def decodeString(self, s: str) -> str:
num_stack = []
char_stack = [] # 字符栈
for i in range(len(s)):
c = s[i]
if self._is_num(c): # 如果当前的数是个数字
cur_num = int(s[i])
if (i>0 and self._is_num(s[i-1])):
last_num = num_stack[-1]
num_stack.pop()# 弹出
cur_num = last_num * 10 + cur_num
num_stack.append(cur_num)
elif self._is_char(c):
char_stack.append(s[i])
# 如果是括号
elif self._is_bracket(c):
if c == "[" :
char_stack.append('[')
continue
else: # 需要出栈操作
tmp=""
while(char_stack[-1]!='['):
tmp += char_stack[-1]
char_stack.pop() # 出栈
tmp = "".join(list(reversed(tmp)))
# print(tmp)
char_stack.pop() # 将[符号 出栈
new_s = tmp * num_stack[-1]
num_stack.pop()
char_stack.extend(new_s)
res = "".join(char_stack)
return res
# 判断字符是否是个数字
def _is_num(self,char):
if char in ['0','1','2','3','4','5','6','7','8','9']:
return True
return False
def _is_bracket(self,char):
if char == '[' or char == ']':
return True
return False
def _is_char(self,char):
if char >= 'a' and char<='z':
return True
return False
# s = "20[abc]"
# sol = Solution()
# res = sol.decodeString(s)
# print(res)