leetcode 20. 有效的括号(2020.8.14)

【题目】20. 有效的括号

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"
输出: true

示例 2:

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

示例 3:

输入: "(]"
输出: false

示例 4:

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

示例 5:

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

【解题思路1】

栈先入后出思想

  • 先转化为数组存储括号,再依次遍历
  • 遍历到左括号则进栈;
  • 遍历到右括号,判断栈顶是否是匹配的左括号,匹配则左括号出栈;不匹配,则非法;
  • 如果到最后栈中仍然有元素,非法。
//常规解法
class Solution {
    public boolean isValid(String s) {
        Stack<Character>stack = new Stack<Character>();
        char[] c = s.toCharArray();  //将括号字符串转存为数组并挨个扫描
        for(int i=0; i<c.length; i++){
            if(c[i]=='(' || c[i]=='[' || c[i]=='{'){  //遇到左括号进栈
                stack.push(c[i]);
            }else{  //读取到右括号判断栈顶是否是匹配的右括号,若是则将该左括号出栈,若不是则非法
                if(!stack.isEmpty()){
                    if(stack.peek()=='(' && c[i]==')'){
                        stack.pop();
                    }else if(stack.peek()=='[' && c[i]==']'){
                        stack.pop();
                    }else if(stack.peek()=='{' && c[i]=='}'){
                        stack.pop();
                    }else{
                        return false;
                    }  
                }else{  //若栈空则无与之匹配的左括号,非法
                    return false;
                }
            }
        }
        return stack.isEmpty();
    }
}
//此写法比较巧妙
class Solution {
    public boolean isValid(String s) {
        Stack<Character>stack = new Stack<Character>();
        for(char c: s.toCharArray()){  //将输入的括号字符串转化为字符串数组并挨个读取
            if(c=='(')
                stack.push(')');  //读取到左括号便将对应的右括号入栈
            else if(c=='[')
                stack.push(']');
            else if(c=='{')
                stack.push('}');
            else if(stack.isEmpty()||c!=stack.pop())
                return false;  //如果不是三种左括号之一即读取到了右括号,如果栈顶不一致(栈空或者括号类型不对)则匹配非法;若合法此右括号出栈
        }
        return stack.isEmpty();
    }
}

/**
for(char c: s.toCharArray())
//等同于
char[] cs = s.toCharArray(); 
for(int i=0; i<cs.length; i++){
	char c = cs[i]; 
}
**/
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页