【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]”
相关文章
- Java实现 LeetCode 808 分汤 (暴力模拟)
- Java实现 LeetCode 806 写字符串需要的行数 (暴力模拟)
- Java实现 LeetCode 796 旋转字符串 (水题)
- Java实现 LeetCode 796 旋转字符串 (水题)
- Java实现 LeetCode 680 验证回文字符串 Ⅱ(暴力)
- Java实现 LeetCode 589 N叉树的前序遍历(遍历树)
- Java实现 LeetCode 459 重复的子字符串
- Java实现 LeetCode 438 找到字符串中所有字母异位词
- Java实现 LeetCode 434 字符串中的单词数
- Java实现 LeetCode 434 字符串中的单词数
- Java实现 LeetCode 429 N叉树的层序遍历
- Java实现 LeetCode 394 字符串解码
- Java实现 LeetCode 98 验证二叉搜索树
- [LeetCode] Search a 2D Matrix II
- LeetCode-788. 旋转数字【暴力,动态规划,字符串,数学】
- LeetCode-895. 最大频率栈【栈,哈希表,设计,有序集合】
- (链表专题) 24. 两两交换链表中的节点 ——【Leetcode每日一题】
- Python 刷Leetcode题库,顺带学英语单词(30)
- Leetcode 1979. 找出数组的最大公约数
- Leetcode 443. 压缩字符串
- [LeetCode] 62. 不同路径 ☆☆☆(动态规划)
- 【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
- 【LeetCode】43. 字符串相乘
- 【LeetCode】剑指 Offer II 016. 不含重复字符的最长子字符串
- 【leetcode】leetcode1 两数之和
- leetcode 字符串转换整数 (atoi)