有效的括号

题目

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

示例 1:

输入:s = “()”
输出:true
示例 2:

输入:s = “()[]{}”
输出:true
示例 3:

输入:s = “(]”
输出:false

分析

这是栈的应用中最典型的一道题目,栈非常适合做对称或者匹配的题目。这个题目中,括号不匹配无外乎三种情况:

  1. 字符串中左括号比右括号多 。
  2. 字符串中右括号比左括号多。
  3. 左右括号数量相同但左右类型不匹配。

我们针对这三种情况在一次循环中全部判断清楚。

注意:

这里不能对空的数组进行pop操作,所以在第9行判断时应该加一句栈空的判断。这里如果栈空说明右括号多于左括号,直接返回False即可。

代码

1
2
3
4
5
6
7
8
9
10
11
class Solution:
def isValid(self, s: str) -> bool:
pair = {"(":")","[":"]","{":"}"}
stack = []
for i in s:
if i in pair:
stack.append(i)
else:
if len(stack) == 0 or pair[stack.pop()] != i:
return False
return False if len(stack) else True

删除字符串中的所有相邻重复项

题目

给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。

在 S 上反复执行重复项删除操作,直到无法继续删除。

在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

示例:

输入:“abbaca”
输出:“ca”
解释:
例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最后的字符串为 “ca”。

分析

这个题目可以很容易的想到是用栈解决问题,逐个把S中的元素推入栈中然后比较后一个元素是否与栈顶元素一致。

注意:

我第一次写的时候细节没到位,在栈空的时候插元素需要跳过。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution:
def removeDuplicates(self, S: str) -> str:
if not S:return ""
stack = []
for i in S:
if not stack:
stack.append(i)
continue
if i == stack[-1]:
stack.pop()
else:
stack.append(i)
return "".join(stack)