栈与队列2
今天开始栈与队列第二天了,最近做的题,都是比较轻松的,毕竟不是第一次接触。
20. 有效的括号
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
解题思路:
- 已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false
- 遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false
- 遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false
字符串遍历完之后,栈是空的,就说明全都匹配了。
小技巧,在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了,比左括号先入栈代码实现要简单的多了!
class Solution:
def isValid(self, s: str) -> bool:
stack = []
for i in s:
if i in ['(','{','[']:
stack.append(i)
else:
if stack:
if i ==')' and stack[-1] == '(':
stack.pop()
elif i ==']' and stack[-1] == '[':
stack.pop()
elif i =='}' and stack[-1] == '{':
stack.pop()
else:
return False
else:
return False
return True if stack == [] else False
第一遍写这个的时候,考虑不周,没有考虑到栈已经为空,而接下来还有右括号未匹配的情况,还是做题前,没有先分析好所有情况。
class Solution:
def isValid(self, s: str) -> bool:
stack = []
for i in s:
if i == '(':
stack.append(')')
elif i == '[':
stack.append(']')
elif i == '{':
stack.append('}')
elif not stack or stack[-1] != i:
return False
else:
stack.pop()
return True if stack == [] else False
1047. 删除字符串中的所有相邻重复项
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
解法一:
class Solution:
def removeDuplicates(self, s: str) -> str:
stack = []
for i in s:
if stack and i == stack[-1]:
stack.pop()
else:
stack.append(i)
return ''.join(stack)
解法二:双指针
class Solution:
def removeDuplicates(self, s: str) -> str:
res = list(s)
slow=fast=0
while fast < len(s):
res[slow] = res[fast]
if slow > 0 and res[slow] == res[slow-1]:
slow -= 1
else:
slow += 1
fast += 1
return ''.join(res[:slow])
150. 逆波兰表达式求值
给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:
- 有效的算符为 ‘+’、‘-’、‘*’ 和 ‘/’ 。
- 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
- 两个整数之间的除法总是 向零截断 。
- 表达式中不含除零运算。
- 输入是一个根据逆波兰表示法表示的算术表达式。
- 答案及所有中间计算结果可以用 32 位 整数表示。
遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
stack = []
for i in tokens:
if i not in ['+','-','*' ,'/']:
stack.append(i)
else:
first_num = stack.pop()
second_num = stack.pop()
stack.append(int(eval(f'{second_num} {i} {first_num}')))
return int(stack.pop())
今天题目比较简单,也都做过,花了1小时完成,思路大概都清楚,就是代码细节上欠缺考虑,还得多练,其中第二题双指针法没怎么理解明白,模拟过程比较模糊,需要多花时间去想清楚整个过程,逆波兰表达式要明白怎么计算的,是后缀表达式。