LeetCode 20. 有效的括号
题目链接
思路
遍历字符串
1、左方向的就往栈中加入对应右方向
2、右方向的就判断是否和栈顶元素相同,相同就pop,不相同False(说明符号串位)
3、如果栈空而元素未遍历结束,返回False(说明右方向的多了)。如果元素遍历结束但栈为空,返回False(说明左方向多了)
class Solution:
def isValid(self, s: str) -> bool:
stack_out = []
res = list(s)
for i in res:
if i == '(':
stack_out.append(')')
elif i == '{':
stack_out.append('}')
elif i == '[':
stack_out.append(']')
else:
if stack_out and i == stack_out[-1]:
stack_out.pop()
else:
return False
if stack_out:
return False
else:
return True
反思
总结是不符合的情况一共只有三种:
1、(({[]}) (左边多了)
2、(){[}](左右不对称,串了
3、({}[]))))) (右边多了)
把这三种情况都考虑进去就可以了
LeetCode 1047. 删除字符串中的所有相邻重复项
题目链接
思路
还是一样的做匹配操作,如果遍历的元素与栈顶元素一致,则取出,否则加入栈
class Solution:
def removeDuplicates(self, s: str) -> str:
stack = []
res = list(s)
for i in res:
if stack and i == stack[-1]:
stack.pop()
else:
stack.append(i)
return "".join(stack)
反思
对栈的基础运用
LeetCode 150. 逆波兰表达式求值
题目链接
思路
遍历字符串数组,如果拿到的是数字,存入栈中,如果拿到的是运算符号,取出栈中前两个元素,运算后的结果再存入栈中,直至遍历结束且栈为空
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
stack = []
for i in tokens:
if i not in {'+', '-', '*', '/'}:
stack.append(i)
else:
secondnum, firstnum= stack.pop(), stack.pop()
result = int(eval(f'{firstnum} {i} {secondnum}')) #输出结果保留整数,要加int
stack.append(result)
return int(stack.pop())
反思
问题一:取出的是操作符,怎么表示我要运算(除了写4个if)
解决方案:eval()函数
eval(f'{firstnum} {i} {secondnum}')
新学习:f’’ (格式化字符串常量)
f-string在功能方面不逊于传统的%-formatting语句和str.format()函数
>>> name = 'Eric'
>>> f'Hello, my name is {name}'
'Hello, my name is Eric'