LeetCode题目笔记--20.有效的括号

题目描述

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

  看到这道题,我联想到了之前学C语言的时候做过的一个题目,实现四则运算,那个使用栈来做的,这个也是,用栈来做。
  当然,我第一遍做的时候没有想到栈,而是用那种最憨的办法,一个个的if,else,if套if,代码又臭又长不说,提交上去还错了。于是痛定思痛,想到用栈。
  不废话了,三种括号有优先顺序,即 { 不能出现在 [ 和 ( 的右边, [ 不能出现在 ( 的右边。当然,用栈的话,就能解决这个问题。用一个字典来表示右括号与左括号的索引,遍历这个符号串,遇到一个左括号,就将其入栈。遇到右括号,观察栈顶是否有跟其相匹配的左括号,有则将那个左括号从栈弹出,无则说明不符规则,直接返回false,直到遍历完,最后返回栈是否为空即可。

伪代码描述

for char in s:
  if char 是左括号:
    入栈
  else:
    if栈不为空:
      取栈顶元素c,
      c 不等于相应左括号,返回false
    否则继续
return stack.len == 0

python代码

class Solution:
    def isValid(self, s: str) -> bool:
        stack = []
        buf = dict([('}', '{'), (']', '['), (')', '(')])
        for c in s:
            if c in ['(', '[', '{']:
                stack.append(c)
            else:
                topc = stack.pop() if stack else None
                if topc != buf[c]:
                    return False
        return len(stack) == 0

  提交,运行,48ms,有点low,还能不能更快?当然!观察代码,第二行创建字典的代码可以精简,第一个if里的 in操作比较耗时,else里的三元运算操作也比较耗时,既然我们怕栈为空时pop会报错,那为什么不在初始化时加入一个“空字符”占位置呢?

更快的python代码

class Solution:
    def isValid(self, s: str) -> bool:
        stack = ['#']
        buf = {
    
    '}':'{', ']':'[', ')':'('}
        for c in s:
            if c == '(' or c == '[' or c == '{':
                stack.append(c)
            else:
                if stack.pop() != buf[c]:
                    return False
                
        return stack.__len__() == 1

C++代码

class Solution {
    
    
public:
    bool isValid(string s) {
    
    
        stack <char> temp;
        map <char, char> buf = {
    
    {
    
    ')', '('}, {
    
    ']', '['}, {
    
    '}', '{'}};
        for(char c : s)
        {
    
    
            if (c == '(' || c == '[' || c == '{')
            {
    
    
                temp.push(c);
            }
            else
            {
    
    
                if(temp.empty() || temp.top() != buf[c])   return false;
                else temp.pop();
            }
        }
        return temp.empty();
    }
};

编译的代码就是爽啊,0ms就完事儿了。

猜你喜欢

转载自blog.csdn.net/weixin_44801799/article/details/107866259