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

20.  有效的括号

题目链接https://leetcode.cn/problems/valid-parentheses

解法

使用栈来做。分为左括号和右括号,最后进的左括号,最先需要右括号来匹配,于是符合后进先出的思想。

栈中放右括号,但遍历到左括号时,相应的右括号入栈;当遍历到相等的右括号时,栈中的右括号出栈。

如果遍历过程中,栈中元素为空,或者字符串中括号和栈中的括号不相等,则是无效的。

遍历结束后,栈中元素不为空,则无效,为空则都匹配上了,为有效。

边界条件:无

时间复杂度O(n)

空间复杂度O(n)

class Solution(object):
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        stack = []
        for char in s:
            if char == "(":
                stack.append(")")
            elif char == "[":
                stack.append("]")
            elif char == "{":
                stack.append("}")
            else:
                # 遍历过程中,栈中元素为空,或者字符串中括号和栈中的括号不相等,
                # 则是无效的
                if not stack or stack[-1] != char:
                    return False
                else:
                    # 匹配中了,则消消乐
                    stack.pop()

        # 如果栈中还有未消除的,则存在未匹配的
        return not stack

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

题目链接https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string

解法

这道题太简单了,就是用一个列表作为栈,进行消消乐。

边界条件:无

时间复杂度O(n)

空间复杂度O(n)

class Solution(object):
    def removeDuplicates(self, s):
        stack = []
        for char in s:
            if stack and stack[-1] == char:
                stack.pop()
            else:
                stack.append(char)
        return "".join(stack)

150.  逆波兰表达式求值 

题目链接https://leetcode.cn/problems/evaluate-reverse-polish-notation

解法

这道理总体思路不难,还是用栈做消消乐。

有些小技巧和坑需要注意:首先是除法要向零截断,那么用 x // y就不行,因为当其中有一个负数时,会有问题,应该用 int(x / y);另外就是把四种函数整理成一个map,写起来简洁。

另外,在提交代码时,选python2会报case不通过,选python3却没问题。

边界条件:无

时间复杂度O(n)

空间复杂度O(n)

class Solution:
    def evalRPN(self, tokens: List[str]) -> int:
        # 注意这个除法,不要写成 x // y
        op_map = {'+': add, '-': sub, '*': mul, '/': lambda x, y: int(x / y)}
        stack = []
        for token in tokens:
            if token not in {'+', '-', '*', '/'}:
                stack.append(int(token))
            else:
                op2 = stack.pop()
                op1 = stack.pop()
                stack.append(op_map[token](op1, op2))  # 第一个出来的在运算符后面
        return stack.pop()

你可能感兴趣的:(数据结构和算法,算法)