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