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

20. 有效的括号

题目链接/文章讲解/视频讲解:https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html

  • 考点
  • 我的思路
    • 利用标志位记录遇到了什么字符,遇到左括号加1,右括号减1,最后判断结果是否为0
    • 这种思路解决不了先出现右括号,再出现左括号的情况(需要额外添加逻辑判断)
  • 视频讲解关键点总结
    • 使用栈结构
    • 遇到左向符号则压栈,遇到右向字符则弹栈并判断是否匹配,若不匹配,则报错 ;遇到右向字符后发现弹栈为空,报错;循环结束后,发现栈中仍有剩余,报错
  • 我的思路的问题
    • 这种思路解决不了先出现右括号,再出现左括号的情况(需要额外添加逻辑判断)
  • 代码书写问题
  • 可执行代码
class Solution(object):
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        stack_bracket = []
        for st in s:
            if st == '(':
                stack_bracket.append('(')
            elif st == ')':
                if len(stack_bracket) == 0 or '(' != stack_bracket.pop():
                    return False
            elif st == '[':
                stack_bracket.append('[')
            elif st == ']':
                if len(stack_bracket) == 0 or '[' != stack_bracket.pop():
                    return False
            elif st == '{':
                stack_bracket.append('{')
            else:
                if len(stack_bracket) == 0 or '{' != stack_bracket.pop():
                    return False
        if len(stack_bracket) != 0:
            return False
        else:
            return True

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

题目链接/文章讲解/视频讲解:https://programmercarl.com/1047.%E5%88%A0%E9%99%A4%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E7%9B%B8%E9%82%BB%E9%87%8D%E5%A4%8D%E9%A1%B9.html

  • 考点
    • 栈或双指针
  • 我的思路
    • 栈结构
    • 遍历字符串,如果当前字符与栈弹出的元素相等,把原字符串的当前字符与上一字符删除
  • 视频讲解关键点总结
    • 栈结构
    • 仅利用栈即可,在过程中不需要修改原字符串
    • 如果栈弹出的字符与当前字符相等,则继续下一轮循环即可,此时这两个字符都会不出现在栈里
    • 循环结束后,把栈(列表)转换为字符串并返回即可
  • 我的思路的问题
    • 实测发现我这种一直修改字符串并重新循环的思路时间复杂度过高
  • 代码书写问题
    • 直接按照列表的操作写就行,不必非要模仿栈
  • 可执行代码
class Solution(object):
    def removeDuplicates(self, s):
        """
        :type s: str
        :rtype: str
        """
        l = []
        for st in s:
            if l and l[-1] == st:
                l.pop()
            else:
                l.append(st)
        return ''.join(l)

*150. 逆波兰表达式求值

题目链接/文章讲解/视频讲解:https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html

  • 考点
    • 后缀表达式和栈
  • 我的思路
    • 无思路
  • 视频讲解关键点总结
    • 后缀表达式,每次遇到数字加入栈,遇到运算符就从栈里取两个值进行运算后再压栈,循环结束后返回栈的第一个值,即为结果
  • 我的思路的问题
  • 代码书写问题
  • 可执行代码
class Solution(object):
    def evalRPN(self, tokens):
        """
        :type tokens: List[str]
        :rtype: int
        """
        l = []
        for t in tokens:
            if t != '+' and t != '-' and t != '*' and t != '/':
                l.append(int(t))
            else:
                num1 = l.pop()
                num2 = l.pop()
                if t == '+':
                    l.append(num2 + num1)
                elif t == '-':
                    l.append(num2 - num1)
                elif t == '*':
                    l.append(num2 * num1)
                else:
                    l.append(int(num2 / num1))
        return int(l[0])

你可能感兴趣的:(Leetcode,代码随想录(Python),算法,python)