本系列文章是我刷代码随想录过程中的笔记。代码地址:leetcode
今天是我刷“代码随想录”的第九天
今日内容
- 20.有效的括号
- 1047.删除字符串中的所有相邻重复项
- 150.逆波兰表达式求值
leetcode 20. 有效的括号
简单题,用一个字典记录左括号对应的右括号的值。遍历字符串。遇到左括号就将对应的右括号放入栈中,遇到右括号就判断是否与栈顶元素相同。如果不相同,直接返回false,如果相同,弹出栈顶元素,继续遍历。最后返回栈是否为空。
class Solution:
def isValid(self, s: str) -> bool:
l = []
d = {
"(": ")",
"[": "]",
"{": "}"
}
for i in s:
if i in d.keys():
l.append(d[i])
else:
if not l: return False
if i == l[-1]:
l.pop(-1)
else:
return False
return len(l) == 0
leetcode 1047. 删除字符串中的所有相邻重复项
遍历字符串,如果栈为空或者栈顶元素与当前遍历元素不相同,将该元素添加进栈中,反之,直接跳过。最后将栈中的元素拼成字符串。
class Solution:
def removeDuplicates(self, s: str) -> str:
l = []
for i in s:
if not l or l[-1] != i:
l.append(i)
else:
l.pop(-1)
return "".join(l)
leetcode 150. 逆波兰表达式求值
这道题要注意的是前面的数+-*/后面的数。而弹出的时候时先后后前。遍历列表,碰到操作符弹出栈顶的元素,碰到数字就添加进栈中
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
l = []
for i in tokens:
if i == "+":
a = l.pop()
b = l.pop()
l.append(b + a)
elif i == "-":
a = l.pop()
b = l.pop()
l.append(b - a)
elif i == "*":
a = l.pop()
b = l.pop()
l.append(b * a)
elif i == "/":
a = l.pop()
b = l.pop()
l.append(int(b / a))
else:
l.append(int(i))
return l[0]