题目:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
思路:
第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false
第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false
第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false
当最后字符串匹配完,栈为空,则全部匹配完成
class Solution:
def isValid(self, s: str) -> 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()
return True if not stack else False
题目:
给出由小写字母组成的字符串 S
,重复项删除操作会选择两个相邻且相同的字母,并删除它们。
在 S 上反复执行重复项删除操作,直到无法继续删除。
在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。
思路:要记得是把字符串变为列表,最后要拼接回去。
class Solution:
def removeDuplicates(self, s: str) -> str:
stack_in=[]
for i in range(len(s)):
if stack_in and stack_in[-1]==s[i]:
stack_in.pop()
else:
stack_in.append(s[i])
return "".join(stack_in)
#其实不必访问下标也可以,做法变复杂了,更消耗内存
class Solution:
def removeDuplicates(self, s: str) -> str:
res=list(s)
slow,fast=0,0
n=len(res)
while fast<n:
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])
#我不太理解最后一步,快慢指针互换完会继续往前走一步,为什么会是返回的slow的开区间
题目:给你一个字符串数组 tokens
,表示一个根据 逆波兰表示法 表示的算术表达式。
请你计算该表达式。返回一个表示表达式值的整数。
注意:
- 有效的算符为
'+'
、'-'
、'*'
和'/'
。 - 每个操作数(运算对象)都可以是一个整数或者另一个表达式。
- 两个整数之间的除法总是 向零截断 。
- 表达式中不含除零运算。
- 输入是一个根据逆波兰表示法表示的算术表达式。
- 答案及所有中间计算结果可以用 32 位 整数表示。
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
stack_in=[]
for i in tokens:
if i not in ["+","-","*","/"]:
stack_in.append(int(i))
elif i=="+":
stack_in[-1]=stack_in[-2]+stack_in.pop()
elif i=="-":
stack_in[-1]=stack_in[-2] -stack_in.pop()
elif i=="*":
stack_in[-1]=stack_in[-2] * stack_in.pop()
elif i=="/":
stack_in[-1]=int(stack_in[-2] / stack_in.pop())
return stack_in[0]
#开始一直是除法有小数,找了半天原来是没有用整数除法
class Solution:
def evalRPN(self, tokens: List[str]) -> int:
stack=[]
for token in tokens:
if token in ['+','-','*','/']:
b=int(stack.pop())
a=int(stack.pop())
if token=='+':
stack.append(a+b)
elif token=='-':
stack.append(a-b)
elif token=='*':
stack.append(a*b)
elif token=='/':
if a%b==0 or a/b>0:
res=a//b
else:
res=a//b+1#注意要向上取整
stack.append(res)
else:
stack.append(int(token))
return int(stack[0])
今日用时:两个半小时 能把大体框架写出来一些,但是不完整,继续加油。