力扣20. 有效的括号
栈的典型例题。容易误解题目意思,括号出现类型的顺序也必须匹配,如注释。
class Solution:
def isValid(self, s: str) -> bool:
stack = []
# 注意题目意思第一个出现的右括号应该和第一个出现的左括号类型匹配: ([)]为无效
for item in s: # 遍历到左括号,把对应的右括号压入栈
if item == '(':
stack.append(')')
elif item == '[':
stack.append(']')
elif item == '{':
stack.append('}')
elif not stack or stack[-1] != item: # 当为右括号或(s仅有右括号)时,或括号类型不匹配时
return False
else:
stack.pop()
return True if not stack else False
力扣1047. 删除字符串中的所有相邻重复项
一开始没有理解题目意思,以为逢两次出现则删除,原来需要相邻才删。
class Solution:
def removeDuplicates(self, s: str) -> str:
res = list()
for item in s:
if res and res[-1] == item: # 相邻的相同字母很关键!
res.pop()
else:
res.append(item)
return "".join(res) # 字符串拼接
150. 逆波兰表达式求值
栈的使用。注意只有/运算时,讲究前面的数/后面的数这样的运算顺序。
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
com = ["+","-","*","/"]
formula = []
for item in tokens:
if item not in com: # 不为运算符时
formula.append(item)
else:
num2 = formula.pop()
num1 = formula.pop()
formula.append(int(eval(f"{num1}{item}{num2}")))
return int(formula.pop())