20:有效的括号

问题描述

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例

输入: "()"
输出: true
输入: "()[]{}"
输出: true
输入: "(]"
输出: false
输入: "([)]"
输出: false
输入: "{[]}"
输出: true

思路

数据结构-栈的经典问题。
遇到左括号,入栈。遇到右括号,如果栈为空,return false. 如果栈不为空,但栈顶元素与右括号不配对,return false. 否则的话出栈。
处理完之后,如果栈为空,return true. 否则false.
当然啦可以优化一下,如果这个括号序列是奇数的,则可以直接返回false了。

解决方案Java版

class Solution {
    public boolean isValid(String s) {
        if((s.length()&1) == 1){
            return false;
        }
        Stack<Character> stack = new Stack<>();
        Map<Character,Character> map = new HashMap<>();
        Set<Character> left = new HashSet<>();
        init(map,left);
        for(int i = 0; i < s.length(); i++){
            if(left.contains(s.charAt(i))){
                stack.push(s.charAt(i));
            }else if(stack.empty()){
                return false;
            }else if(map.get(s.charAt(i)) != stack.peek()){
                return false;
            }else{
                stack.pop();
            }
        }
        return stack.empty();
    }
    private void init(Map<Character,Character> map,Set<Character> set){
        map.put(')','(');
        map.put(']','[');
        map.put('}','{');
        set.add('(');
        set.add('[');
        set.add('{');
    }
}

解决方案Python版

class Solution:
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        if s == '': # 空字符串直接返回True
            return True
        elif len(s)&1:
        	return False
        stack = []
        for i in s:
            if i == '{' or i == '(' or i == '[':
                stack.append(i)
            else:
                if not len(stack): # 右侧符号遇到栈空,直接返回False
                    return False
                if i == '}' and stack[-1] == '{':
                    stack.pop()
                elif i == ')' and stack[-1] == '(':
                    stack.pop()
                elif i == ']' and stack[-1] == '[':
                    stack.pop()
                else:
                    return False # 栈外没有与栈顶配对,返回False
        if len(stack): # 处理完之后栈非空,返回False
            return False
        return True
发布了333 篇原创文章 · 获赞 22 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_41687289/article/details/104566452