代码随想录算法训练营第11天|20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值

20. 有效的括号 

题目链接:LeetCode - The World's Leading Online Programming Learning Platform

题目链接/文章讲解/视频讲解:代码随想录

解题思路:

设置一个stack和括号的map 

遍历s,如果s是左括号放入stack,如果是右括号看时候stack最后一个值是左括号对应的type,如果不是或者stack为空return false,检测完成则popstack的最后一个值。

遍历完成后检测是否stack是否为空 空的话就可以return true。 

class Solution(object):
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        hashtable={')':'(',']':'[','}':'{'}
        left={'(','{','['}
        right={')',']','}'}
        stack=[]
        for i in s:
            if i in left:
                stack.append(i)
            elif i in right:
                if not stack or stack[-1]!=hashtable[i]:
                    return False
                stack.pop()
        return True if not stack else False
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

1047. 删除字符串中的所有相邻重复项 

题目链接:LeetCode - The World's Leading Online Programming Learning Platform

题目链接/文章讲解/视频讲解:代码随想录

解题思路:

建空stack

遍历s 如果stack为空或者stack最后一位不是i则appendi,如果最后一位==i则删除最后一位。

遍历完return结果。 

class Solution(object):
    def removeDuplicates(self, s):
        """
        :type s: str
        :rtype: str
        """
        stack=[]
        for i in s:
            if not stack or stack[-1]!=i:
                stack.append(i)
            elif stack[-1]==i:
                stack.pop()
        return ''.join(stack)
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

150. 逆波兰表达式求值 

题目链接:LeetCode - The World's Leading Online Programming Learning Platform

题目链接/文章讲解/视频讲解:代码随想录

解题思路:

建立一个stack

遍历tokens,如果是数字就append进stack 如果是符号就进行计算,计算时 pop两个数字 因为除法有顺序 所以pop的第一个数字作为2 第二个数字作为1 进行计算 计算完放回进stack。 遍历结束后返回结果。 注意在python中 6/(-132)=-1而不是0

class Solution(object):
    def evalRPN(self, tokens):
        """
        :type tokens: List[str]
        :rtype: int
        """
        operator={'+','-','*','/'}
        stack=[]
        num1=None
        num2=None
        for i in tokens:
            if i not in operator:
                stack.append(int(i))
            elif i in operator:
                if i =="+":
                    num2=stack.pop()
                    num1=stack.pop()
                    stack.append(num1+num2)
                elif i =="-":
                    num2=stack.pop()
                    num1=stack.pop()
                    stack.append(num1-num2)
                elif i =="*":
                    num2=stack.pop()
                    num1=stack.pop()
                    stack.append(num1*num2)
                elif i =="/":
                    num2=stack.pop()
                    num1=stack.pop()
                    stack.append(int((num1)/num2))
        return stack.pop()
                
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值