zl程序教程

您现在的位置是:首页 >  其他

当前栏目

【LeetCode】394. 字符串解码

LeetCode 字符串 解码
2023-09-14 09:13:23 时间

0.总结

发现竟然还是有一些代码片段不熟悉:

  • (a) 判断一个字符是否是数字字符? => 其实完全不必自己手写,直接调用 isdigit函数即可
  • (b) 可能数字是一个多位数,需要注意
  • © python中循环的变量好像是无法更改的。

本题我写了较长时间。主要是因为在读题的时候不仔细,没有查看数据的要求。从而导致花费了一些时间!

1.题目

2.思想

(1)字符串可以嵌套,所以要从最里面开始解码
(2)使用栈解决这个问题。一个是数字栈,一个是字母栈

3.代码

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

4.特殊样例

s = “20[abc]”
s = “2[kd3[eda]f]”