LeetCode 20. 有效的括号Java

103 阅读1分钟

LeetCode 20. 有效的括号

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
 

示例 1:

输入:s = "()"
输出:true
示例 2:

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

输入:s = "(]"
输出:false
class Solution {
    public boolean isValid(String s) {
        int n = s.length();
        //长度不是偶数直接返回false
        if(n % 2 == 1){
            return false;
        }
        HashMap<Character,Character> map = new HashMap<>();
        map.put('(', ')');
        map.put('[', ']');
        map.put('{', '}');
        //使用栈,遍历字符串
        Stack<Character> stack = new Stack<>();
        for (char c : s.toCharArray()) {
            //如果包含此键 就入栈
            if (map.containsKey(c)) {
                stack.push(c);
            }else{
                // 栈为空了 或者 栈顶对应的键的值 与 当前字符不匹配 则返回false
                if (stack.isEmpty() || map.get(stack.pop()) != c) {
                    return false;
                }
            }
          }
         //最后返回栈是否为空 即为对应的结果
        return stack.isEmpty();
     }
}

image.png

class Solution {
    public boolean isValid(String s) {
         //不创建map,在原字符串上比较
        if(s.length()%2==0){
            Stack<Character> stack=new Stack<>();
            for(int i=0;i<s.length();i++){
                char c=s.charAt(i);
                if(c=='('||c=='['||c=='{'){
                    stack.push(c);
                }
                else if(c==')'){
                    if(!stack.isEmpty()&&stack.peek()=='('){stack.pop();}
                    else{return false;}
                }
                else if(c=='}'){
                    if(!stack.isEmpty()&&stack.peek()=='{'){stack.pop();}
                    else{return false;}
                }
                else{
                    if(!stack.isEmpty()&&stack.peek()=='['){stack.pop();}
                    else{return false;}
                }
            }
            return stack.isEmpty();
        }
        return false;
    }
}

image.png