代码随想录算法训练营第十一天|20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值
20. 有效的括号
题目链接:有效的括号
这题想的时候其实是想出来了,但实现的时候不是很确定。
他的要求是:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
所以就做一个栈,遍历字符串
如果是左括号,就把对应的左括号入栈;
如果是右括号,
如果此时栈里没有元素就是无对应括号,直接就False,
如果此时栈里有元素但是对不上,也False
如果此时栈里有元素也能对上才可以继续。
整个s遍历完,如果没有剩下的括号,就True;有剩下的就False。
class Solution:
def isValid(self, s: str) -> bool:
d = {}
d['('] = ')'
d['{'] = '}'
d['['] = ']'
stack = []
for i in s:
if i in d:
stack.append(d[i])
elif not stack or i != stack[-1]:#如果是i不是左边的stack里也没有配对,就错了
return False
elif i == stack[-1]:
stack.pop()
#print(stack)
if not stack:
return True
else:
return False
1047. 删除字符串中的所有相邻重复项
题目链接:删除字符串中的所有相邻重复项
做一个栈,遍历字符串
如果栈是空的,就把元素放进去;
如果栈不是空的,
当前遍历元素和栈里最后一个一样就把栈里一样的pop掉,
如果不一样就就把当前元素放进去。
class Solution:
def removeDuplicates(self, s: str) -> str:
stack = []
for i in s:
if not stack or i != stack[-1]: #如果是空的
stack.append(i)
elif i == stack[-1]:
stack.pop()
return ''.join(stack)
150. 逆波兰表达式求值
题目链接:逆波兰表达式求值
首先要处理怎么把字符串运算符号变成真的运算符号。
我这里是用了add(), sub(), mul(), truediv()
用字符串做字典来处理的
这里的运算规则是如果遇到运算符号,那么用这个运算符号计算前面两个数字,再放回去看。
做一个栈,遍历数组,
如果是数字的话就入栈,这里注意str.isdigit()
并不认负数,注意处理。
是运算符号的话就去字典找对应的操作,然后pop掉前面两位的数字,拿来进行计算,最后再放回栈中继续参与接下去的计算。
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
d = {}
d['+'] = add
d['-'] = sub
d['*'] = mul
d['/'] = truediv
stack = []
for i in tokens:
if i.isdigit():
stack.append(i)
elif i[0]=='-' and i[1:].isdigit():
stack.append(i)
if i in d:
a = stack.pop()
b = stack.pop()
stack.append(d[i](int(b),int(a)))
return int(stack[0])
这里注意eval()
也可以用来执行一个字符串表达式
eval(f'{second_num} {item} {first_num}')