文章目录
Stack
Decode and Encode String
总结:
- 可以用DFS做也可以用Stack做,但是stack应该是最优解
- 在面试的时候最好先用dfs的那种思考方法写开再弄
- 分类方法有四个
- [, 这个是recuision的开始,需要挂起以前存的string和cnt,如果是dfs,就直接和下一层recursion结合就可以了,如果是stack,需要存cnt和string在stack里面,并且清零二者
- ], 这个是recursion的结束,如果是dfs,直接返回结果就好,如果是stack,需要把这一层的结果和之前的结果相结合,所以需要pop之前的两个,一个相加一个相乘。这个不需要任何清零
- 数字, 只需要更新cnt就可以了
- character,只需要更新string就可以了
经典题目:
Decode String
s = “3[a]2[bc]”, return “aaabcbc”.
s = “3[a2[c]]”, return “accaccacc”.
s = “2[abc]3[cd]ef”, return “abcabccdcdcdef”.
做法:
5. dfs
6. stack
DFS
decodeString(3[a2[c]]) = 3 * decodeString(a2[c]) = 3 * ( decodeString(a) + 2 * decodeString©) = 3 * acc = accaccacc
class Solution:
def decodeString(self, s: str) -> str:
start = 0
def dfs():
rst, num = '', 0
nonlocal start # 注意这里是nonlocal
while start < len(s):
if s[start] == '[': # 开启一个新的dfs,并且作为结果append,并且清零num
start += 1
rst += num * dfs()
num = 0
elif s[start] == ']': # 虫洞,会返回到 rst+=num*dfs()这一行
return rst
elif s[start].isdigit():
num = num * 10 + int(s[start])
else:
rst += s[start]
start += 1
return rst
return dfs()
Stack
https://leetcode.com/problems/decode-string/discuss/87662/Python-solution-using-stack
对于每个[, 是一个recursion的开始,所以要把string和num挂起,放进stack里
对于每个], 是一个recursion的结束,观察一个recursion和之前的关系,进行处理
class Solution:
def decodeString(self, s: str) -> str:
stack = []
curString, curNum = '', 0
for c in s:
if c == '[':
stack.append(curString)
stack.append(curNum)
curString, curNum = '', 0
elif c == ']':
preNum, preString = stack.pop(), stack.pop()
curString = preString + preNum * curString
elif c.isdigit():
curNum = curNum * 10 + int(c)
else:
curString = curString + c
return curString
类似题目: calculator
https://leetcode.com/submissions/detail/203495963/
https://leetcode.com/submissions/detail/263682506/
Parenthesis
总结:
- 如果是多种括号,必须用stack来记录?
https://leetcode.com/problems/valid-parentheses/
input: ‘([)]’
output: True or False
多种括号问题,容易错,还是得用stack,用count是不行的。。。 - 如果是一种括号,validate,用count就能做,到底要几个pass?
题目:
最少添加
TreeNode Iterator
https://leetcode.com/problems/binary-search-tree-iterator/
要想清楚为什么stack可以模拟,什么时候深入,什么时候回溯?
三种解法都要会
一种是stack
一种是generator
一种是morris
generator:
https://leetcode.com/problems/binary-search-tree-iterator/
morris
https://blog.csdn.net/yc461515457/article/details/78082042
https://www.geeksforgeeks.org/inorder-tree-traversal-without-recursion-and-without-stack/
时间复杂: O(3n)
- Trapping Rain Water 不是stack
单调栈
给定一个list,找出下一个比这个大的(小的)数字
https://leetcode.com/problems/daily-temperatures/
https://leetcode.com/problems/largest-rectangle-in-histogram/
smallest in lexicographical order
https://leetcode.com/problems/remove-duplicate-letters/
最小字典序。。。。
有点奇怪的题。。。但是确实是单调栈
DFS
二维坐标的dfs
Binary Search
https://leetcode.com/problems/split-array-largest-sum/discuss/?currentPage=1&orderBy=most_votes&query=