'''
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
'''
题目链接:https://leetcode.cn/problems/valid-parentheses/
首先存在三种不匹配的情况:
解题思想:
遍历字符串,首先将遇到的括号入栈,遇到匹配的括号则将字符串出栈。遍历完成后如果栈为空,则说明全都匹配了,否则,存在不匹配的字符串。
本来想自己写写,但是不知道怎么区分左右括号,o(╥﹏╥)o。
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('}')
#not stack:如果栈为空,则返回False。
#这是因为如果栈为空,则没有栈顶元素,也就无法比较。
#stack[-1]!=item:如果栈不为空,但栈顶元素与给定的元素不相同,则返回False。
#stack[-1]是栈顶元素,item是给定的元素。
#如果它们不相同,则说明栈顶元素与给定的元素不匹配。
elif not stack or stack[-1]!=item:
return False
else:
stack.pop()
#简化的条件语句,用于检查栈(stack)是否为空。如果栈为空,则返回True;否则返回False。
return True if not stack else False
现在看真简单。
'''
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
输入:"abbaca"
输出:"ca"
'''
题目链接:https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/
没有看讲解前自己的解题思路是:
1.将每个字符依次入栈,如果入栈的字符与栈顶相同,则将栈顶字母出栈,再将其他字母入栈。
2.注意栈为空的情况。
自己写出来了,(▽)
class Solution(object):
def removeDuplicates(self, s):
"""
:type s: str
:rtype: str
"""
stack=[]
for item in s:
#如果栈为空,将字母放入栈内
if not stack:
stack.append(item)
#如果栈不为空,判断入栈字母是否和栈顶字母相同,相同则将栈顶字母出栈
#不同则入栈
else:
if stack[-1]==item:
stack.pop()
else:
stack.append(item)
return ''.join(stack)
随想录上还给了双指针操作
res=list(s)
slow=fast=0
length=len(res)
while fast<length:
#如果一样一直换,不一样回吧后面的填在slow的位置
res[slow]=res[fast]
#如果发现和前一个不一样,就退一格指针
if slow>0 and res[slow] == res[slow-1]:
slow-=1
else:
slow+=1
fast+=1
return ''.join(res[0:slow])
'''
给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
输入:tokens = ["2","1","+","3","*"]
输出:9
'''
题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/
逆波兰表示法(Reverse Polish Notation,简称RPN),也叫后缀表达式,是一种将中缀表达式转换为后缀表达式的算法。在逆波兰表示法中,操作符位于操作数的后面,因此不需要使用括号来改变运算顺序。
中缀表达式是最常见的表达式形式,它将操作符放在操作数的中间。(3 + 4) * 2
**前缀表达式(也称为波兰式)**是一种将操作符放在操作数之前的表达式形式。例如,“+ 3 4"是一个前缀表达式。前缀表达式不需要使用括号来改变运算顺序,而是通过操作符的位置来确定计算的顺序。”+ * 3 4 2"表示先将3和4相乘,然后再加上2。
**后缀表达式(也称为逆波兰式)**是一种将操作符放在操作数之后的表达式形式。例如,"3 4 +"是一个后缀表达式。后缀表达式也不需要使用括号来改变运算顺序,而是通过操作符的位置来确定计算的顺序。例如,"3 4 * 2 /"表示先将3和4相乘,然后将结果除以2。
没有看解析前的解题思路
1.将元素依次入栈。遇到算法符号时,将栈内元素进行计算后入栈,再入栈其余元素。
没有看讲解前写的代码,不知道为啥会出错。o(╥﹏╥)o
class Solution(object):
def evalRPN(self, tokens):
"""
:type tokens: List[str]
:rtype: int
"""
stack=[]
for i in tokens:
#如果栈为空
stack.append(i)
if i=='+' or i=='-'or i=='*'or i=='/':
res=str(eval(stack[-3]+i+stack[-2]))
#print(res)
for m in range(3):
stack.pop()
stack.append(res)
return int(stack[-1])
'''
出错原因:除法时没有向下取整
以下为修改以后的代码,但是今天力扣更新,在旧版能成功通过,新版报错!
'''
class Solution(object):
def evalRPN(self, tokens):
stack=[]
for i in tokens:
#如果栈为空
stack.append(i)
if i=='+' or i=='-'or i=='*':
res=str((eval(stack[-3]+i+stack[-2])))
for m in range(3):
stack.pop()
stack.append(res)
elif i == '/':
res = str(int(eval(stack[-3] + i + stack[-2])))
for m in range(3):
stack.pop()
stack.append(res)
return int(stack[-1])
随想录代码
from operator import add, sub, mul
class Solution:
op_map = {'+': add, '-': sub, '*': mul, '/': lambda x, y: int(x / y)}
def evalRPN(self, tokens: List[str]) -> int:
stack = []
for token in tokens:
if token not in {'+', '-', '*', '/'}:
stack.append(int(token))
else:
op2 = stack.pop()
op1 = stack.pop()
stack.append(self.op_map[token](op1, op2)) # 第一个出来的在运算符后面
return stack.pop()
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
stack = []
for item in tokens:
if item not in {"+", "-", "*", "/"}:
stack.append(item)
else:
first_num, second_num = stack.pop(), stack.pop()
stack.append(
int(eval(f'{second_num} {item} {first_num}'))
# 第一个出来的在运算符后面
)
return int(stack.pop()) # 如果一开始只有一个数,那么会是字符串形式的
今天的代码能写写了,好感动o(╥﹏╥)o,继续加油!
参考链接:https://programmercarl.com/%E6%A0%88%E4%B8%8E%E9%98%9F%E5%88%97%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html