[Data Structure] Stack and Heap

Stack

Decode and Encode String

总结:

  1. 可以用DFS做也可以用Stack做,但是stack应该是最优解
  2. 在面试的时候最好先用dfs的那种思考方法写开再弄
  3. 分类方法有四个
    1. [, 这个是recuision的开始,需要挂起以前存的string和cnt,如果是dfs,就直接和下一层recursion结合就可以了,如果是stack,需要存cnt和string在stack里面,并且清零二者
    2. ], 这个是recursion的结束,如果是dfs,直接返回结果就好,如果是stack,需要把这一层的结果和之前的结果相结合,所以需要pop之前的两个,一个相加一个相乘。这个不需要任何清零
    3. 数字, 只需要更新cnt就可以了
    4. 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

总结:

  1. 如果是多种括号,必须用stack来记录?
    https://leetcode.com/problems/valid-parentheses/
    input: ‘([)]’
    output: True or False
    多种括号问题,容易错,还是得用stack,用count是不行的。。。
  2. 如果是一种括号,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)

  1. 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=

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值