1.有效的括号
![fbccf3c7d85b0ad45a29f28ad24dff3b.png](https://img-blog.csdnimg.cn/img_convert/fbccf3c7d85b0ad45a29f28ad24dff3b.png)
1)遍历字符串,将左括号入栈;
2)若字符串长度为奇数,则不可能为true直接返回false;
3)若遇右括号,则比较栈顶元素是否与右括号成对;
4)成对,则继续遍历;否则返回false。
class
2.最长有效括号
1)将括号下标入栈;
2)始终保持栈底是“最后一个未匹配的右括号下标”,一开始先置-1;
![487a19701df18fb86e8891db80621f8f.png](https://img-blog.csdnimg.cn/img_convert/487a19701df18fb86e8891db80621f8f.png)
3)若遇到左括号,则push(下标);
![fa545dc994aa1cda396d1879eb5d2a81.png](https://img-blog.csdnimg.cn/img_convert/fa545dc994aa1cda396d1879eb5d2a81.png)
4)若遇到右括号,则先弹栈,再判断:
I. 栈顶弹出后栈为空,说明没有左括号与当前的右括号匹配,此时将当前右括号的下标入栈,即为“最后一个未匹配的右括号下标”;
II. 弹栈后栈不为空,说明有左括号与之匹配,那么更新长度:右括下标-栈顶左括下标;
![a93e873ac662e7741f26e5d7c71498d5.png](https://img-blog.csdnimg.cn/img_convert/a93e873ac662e7741f26e5d7c71498d5.png)
![74a7bb435d0cf1a328109d6aa9025dda.png](https://img-blog.csdnimg.cn/img_convert/74a7bb435d0cf1a328109d6aa9025dda.png)
![0b061f6d97fa012d906e54b69349a921.png](https://img-blog.csdnimg.cn/img_convert/0b061f6d97fa012d906e54b69349a921.png)
![7a46271c7d6d686cdf9d45ff2252a029.png](https://img-blog.csdnimg.cn/img_convert/7a46271c7d6d686cdf9d45ff2252a029.png)
![e94f0b8ec155f9156fc72c6490b364b7.png](https://img-blog.csdnimg.cn/img_convert/e94f0b8ec155f9156fc72c6490b364b7.png)
5)遍历完字符串输出max长度。
class
关于此题的思考:
此题没有思路,完全看的官方题解,有如留言一般的困惑,反直觉,不是先判断再弹栈,而是先弹栈再判断,并且更新的是最近一对括号长度……只能说需要学习的还很多……
![a74a62d0fb9d860d3b845a39d7041a68.png](https://img-blog.csdnimg.cn/img_convert/a74a62d0fb9d860d3b845a39d7041a68.png)
3.最小栈
吐槽:我还以为要手动实现栈操作,后来发现官方就用了容器…合着就实现了一个检索栈中的最小元素…
1)返回栈中最小元素,建立一个辅助栈;
2)每次存储当前所有元素的最小值,这样栈顶也可以保持最小元素;
3)辅助栈栈顶出栈即可。
![75a5c1f9c39001473a7e7c549ebbb65c.png](https://img-blog.csdnimg.cn/img_convert/75a5c1f9c39001473a7e7c549ebbb65c.png)
class
4.去除重复字母
1)题目中有两个关键字:字典序、去重复,借助map和stack来完成,stack用来存储最后的结果;
2)遍历字符串,利用map存储,每个字符最后一次出现的位置;
3)二次遍历,若当前字符已经出现在栈内,则跳过当前字符;
4)若未出现,栈顶元素大于当前字符,且栈顶元素最后一次出现的位置大于当前元素位置,则栈顶元素出栈,当前元素入栈,栈顶元素状态改变为未出现,当前元素改为出现;
5)若未出现,且栈顶元素小于当前字符,则直接入栈,当前元素状态改为出现;
6)将stack内元素转为string元素返回。
![8bfde1f6cf7a11fcf362ec027a96ca56.png](https://img-blog.csdnimg.cn/img_convert/8bfde1f6cf7a11fcf362ec027a96ca56.png)
![5497b191a2a81da579fde19172baf7fa.png](https://img-blog.csdnimg.cn/img_convert/5497b191a2a81da579fde19172baf7fa.png)
![39862701aed7327e3c90c8d245e56ffc.png](https://img-blog.csdnimg.cn/img_convert/39862701aed7327e3c90c8d245e56ffc.png)
![153c6a9a5da74198eb3c9846818279a3.png](https://img-blog.csdnimg.cn/img_convert/153c6a9a5da74198eb3c9846818279a3.png)
![939ee6c2b736b1f710a136ae4de278c3.png](https://img-blog.csdnimg.cn/img_convert/939ee6c2b736b1f710a136ae4de278c3.png)
class
关于此题的思考:
做人的差距也太大了,想不到啊想不到……两个map,一个存储最后一次出现的位置,一个存储是否在stack中出现过;一个stack,边遍历边入栈出栈保持字典序。如果要不看题解我真是万万也想不到的,论一个渣渣的路还要走多久……