20. 有效的括号 - 力扣(LeetCode)
本题一个比较好的思路是遇到左括号入栈右括号,然后遍历到右括号的时候弹出右括号即可。(图:代码随想录)
class Solution(object):
def isValid(self, s):
"""
:type s: str
:rtype: 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: # 如果栈在遍历完之前就结束了或者遍历到的右括号在栈里没有保存
return False
else:
stack.pop()
# 正确返回条件:栈是空的且for循环没有提前终止
return True if not stack else False
1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)
思路
需要单独开一个存储空间,来一边接收新遍历到的字符,一边和之前的比较,相同的连同之前的一起弹出(有点像消消乐)。(图:代码随想录)
栈实现
class Solution(object):
def removeDuplicates(self, s):
"""
:type s: str
:rtype: str
"""
res = list()
# 使用列表的好处是可以不用reverse
for item in s:
if res and res[-1] == item: # 如果当前的res不是空的而且前面一个恰好是重复的字符
res.pop()
else:
res.append(item)
return ''.join(res)
双指针实现
class Solution(object):
def removeDuplicates(self, s):
"""
:type s: str
:rtype: str
"""
res = list(s)
fast, slow = 0, 0
while fast < len(s):
# 先把fast遍历到的传递给slow
res[slow] = res[fast]
# 比较slow接收到的和前一个是否一致
if slow > 0 and res[slow] == res[slow - 1]:
slow -= 1
else:
slow += 1 # 更新slow
fast += 1 # 更新fast
return ''.join(res[:slow])
150. 逆波兰表达式求值 - 力扣(LeetCode)
from operator import add, sub, mul
class Solution(object):
op_map = {
"+": add,
"-": sub,
"*": mul,
"/": lambda x, y: int(x / y), }
def evalRPN(self, tokens):
"""
:type tokens: List[str]
:rtype: int
"""
res = []
for token in tokens:
if token not in self.op_map:
res.append(int(token))
else:
op2 = res.pop() # 注意!!先弹出的是后一个运算的数字
op1 = res.pop()
res.append(self.op_map[token](op1, op2))
return res.pop()
第11天完结🎉