最小栈设计并实现一个minstack类_栈(Leetcode)

1.有效的括号

fbccf3c7d85b0ad45a29f28ad24dff3b.png

1)遍历字符串,将左括号入栈;

2)若字符串长度为奇数,则不可能为true直接返回false;

3)若遇右括号,则比较栈顶元素是否与右括号成对;

4)成对,则继续遍历;否则返回false。

class 

2.最长有效括号

1)将括号下标入栈;

2)始终保持栈底是“最后一个未匹配的右括号下标”,一开始先置-1;

487a19701df18fb86e8891db80621f8f.png

3)若遇到左括号,则push(下标);

fa545dc994aa1cda396d1879eb5d2a81.png

4)若遇到右括号,则先弹栈,再判断:

I. 栈顶弹出后栈为空,说明没有左括号与当前的右括号匹配,此时将当前右括号的下标入栈,即为“最后一个未匹配的右括号下标”;

II. 弹栈后栈不为空,说明有左括号与之匹配,那么更新长度:右括下标-栈顶左括下标;

a93e873ac662e7741f26e5d7c71498d5.png

74a7bb435d0cf1a328109d6aa9025dda.png

0b061f6d97fa012d906e54b69349a921.png

7a46271c7d6d686cdf9d45ff2252a029.png

e94f0b8ec155f9156fc72c6490b364b7.png

5)遍历完字符串输出max长度。

class 

关于此题的思考:

此题没有思路,完全看的官方题解,有如留言一般的困惑,反直觉,不是先判断再弹栈,而是先弹栈再判断,并且更新的是最近一对括号长度……只能说需要学习的还很多……

a74a62d0fb9d860d3b845a39d7041a68.png

3.最小栈

吐槽:我还以为要手动实现栈操作,后来发现官方就用了容器…合着就实现了一个检索栈中的最小元素…

1)返回栈中最小元素,建立一个辅助栈;

2)每次存储当前所有元素的最小值,这样栈顶也可以保持最小元素;

3)辅助栈栈顶出栈即可。

75a5c1f9c39001473a7e7c549ebbb65c.png
class 

4.去除重复字母

1)题目中有两个关键字:字典序、去重复,借助map和stack来完成,stack用来存储最后的结果;

2)遍历字符串,利用map存储,每个字符最后一次出现的位置;

3)二次遍历,若当前字符已经出现在栈内,则跳过当前字符;

4)若未出现,栈顶元素大于当前字符,且栈顶元素最后一次出现的位置大于当前元素位置,则栈顶元素出栈,当前元素入栈,栈顶元素状态改变为未出现,当前元素改为出现;

5)若未出现,且栈顶元素小于当前字符,则直接入栈,当前元素状态改为出现;

6)将stack内元素转为string元素返回。

8bfde1f6cf7a11fcf362ec027a96ca56.png

5497b191a2a81da579fde19172baf7fa.png

39862701aed7327e3c90c8d245e56ffc.png

153c6a9a5da74198eb3c9846818279a3.png

939ee6c2b736b1f710a136ae4de278c3.png
class 

关于此题的思考:

做人的差距也太大了,想不到啊想不到……两个map,一个存储最后一次出现的位置,一个存储是否在stack中出现过;一个stack,边遍历边入栈出栈保持字典序。如果要不看题解我真是万万也想不到的,论一个渣渣的路还要走多久……

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值