LeetCode之算法面试之栈之有效的括号(20)、简化路径(71)、逆波兰表达式求值(150)

  • 1、有效的括号(20)
  • 2、简化路径(71)
  • 3、逆波兰表达式求值(150)

1、有效的括号(20)

题目描述:

【简单题】
LeetCode之算法面试之栈之有效的括号(20)、简化路径(71)、逆波兰表达式求值(150)_第1张图片
题目链接
思路分析

\quad \quad 由于有效括号定是一对左右括号紧密内嵌联系在一起的。也就是说·最里面的左括号是与最外面的右括号相对应的。想到这点就能联想到具有先进后出特点的栈,即若遇到左括号入栈,遇到右括号时将栈顶元素左括号出栈并比较是否为一对的。因此我们可以用栈解决此题:

  • 首先,需要先定义有效括号的对应,可用字典构建左右括号对应关系:key左括号,value右括号。
  • 遍历字符串,并按以下流程依次判断:
    • 如果chat是左括号,则入栈
    • 否则通过字典判断括号对应关系,若栈顶元素于当前遍历元素不对应,则提前返回False。

【python 3 代码实现】

class Solution:
    def isValid(self, s: str) -> bool:
        # 建立有效括号关系的字典
        match_dic = {'{':'}','[':']','(':')','?':'?'}
        # 定义栈,非空原因:若栈为空,则stack.pop()会出错
        stack=['?']
        # 遍历字符串
        for chat in s:
            if chat in match_dic.keys():
                stack.append(chat)
            elif match_dic.get(stack.pop())!=chat:
                return False
        return len(stack)==1
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

2、简化路径(71)

【中等题】
LeetCode之算法面试之栈之有效的括号(20)、简化路径(71)、逆波兰表达式求值(150)_第2张图片

题目链接
思路分析

class Solution:
    def simplifyPath(self, path: str) -> str:
        stack=[]
        path=path.split('/')
        for item in path:
            if item=='..':
                if stack:
                    stack.pop()
            elif item and item != '.':
                stack.append(item)
        return '/'+'/'.join(stack)
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

3、逆波兰表达式求值(150)

【中等题】
根据 逆波兰表示法,求表达式的值。

有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

说明:

整数除法只保留整数部分。
给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。

LeetCode之算法面试之栈之有效的括号(20)、简化路径(71)、逆波兰表达式求值(150)_第3张图片
题目链接
思路分析

你可能感兴趣的:(leetcode,#,栈,python,leetcode,栈)