有效的括号
题目
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。示例 1:
输入:s = “()”
输出:true
示例 2:输入:s = “()[]{}”
输出:true
示例 3:输入:s = “(]”
输出:false
分析
这是栈的应用中最典型的一道题目,栈非常适合做对称或者匹配的题目。这个题目中,括号不匹配无外乎三种情况:
- 字符串中左括号比右括号多 。
- 字符串中右括号比左括号多。
- 左右括号数量相同但左右类型不匹配。
我们针对这三种情况在一次循环中全部判断清楚。
注意:
这里不能对空的数组进行pop操作,所以在第9行判断时应该加一句栈空的判断。这里如果栈空说明右括号多于左括号,直接返回False即可。
代码
1 | class Solution: |
删除字符串中的所有相邻重复项
题目
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
示例:
输入:“abbaca”
输出:“ca”
解释:
例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “ca”。
分析
这个题目可以很容易的想到是用栈解决问题,逐个把S中的元素推入栈中然后比较后一个元素是否与栈顶元素一致。
注意:
我第一次写的时候细节没到位,在栈空的时候插元素需要跳过。
代码
1 | class Solution: |