leetcode 20.有效的括号

1.题目要求

leetcode 20.有效的括号

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

有效字符串需满足:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。

示例 1:

输入:s = "()"
输出:true

示例 2:

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

示例 3:

输入:s = "(]"
输出:false

示例 4:

输入:s = "([)]"
输出:false

示例 5:

输入:s = "{[]}"
输出:true

2.解题思路(java实现)

本题题意旨在判断所给括号是否合法,也就是是否每一个左括号都能找到其对应的右括号,每一个右括号也能找到对应的左括号。
实现结构:栈
(1)首先明确括号要想合法,其长度一定为偶数,如果为奇数则括号不匹配。
(2)我们可以给每一对小中大括号(),[],{}都建立一个map字典。
(3)由于遇到左括号我们就要将左括号入栈,遇到右括号就判断当前栈顶是否为对应左括号,所以可以将map的键定义为右括号,对应的值为其左括号;遇到右括号时,从栈顶弹出一个符号,如果此符号与从map中对应键取出的左括号相同,则匹配。
重复读每一个括号,左括号就入栈,右括号就判断,并弹出栈顶。
(4)读完字符串时,如果当前栈已空,则说明括号匹配,否则不匹配。

3.java代码实现

class Solution {
    public boolean isValid(String s) {

        int n=s.length();
        if(n%2==1)  return false;

        Map<Character,Character> pairs = new HashMap<Character,Character>(){{
            put(')','(');
            put('}','{');
            put(']','[');
        }};
        Deque<Character> stack = new LinkedList<Character>();

        for(int i=0; i<n; i++){
            char ch = s.charAt(i);
            // char ch = s(i);
            if(pairs.containsKey(ch)){
                if(stack.isEmpty() || stack.peek()!=pairs.get(ch) )
                    return false;
                stack.pop();    
            }
            else{
                stack.push(ch);
            }
        }
        return stack.isEmpty();

    }
}

你可能感兴趣的:(力扣,leetcode,算法)