LeetCode

leetcode 20

题目描述

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

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

示例 1:

输入: “()”
输出: true

示例 2:

输入: “()[]{}”
输出: true

示例 3:

输入: “(]”
输出: false

示例 4:

输入: “([)]”
输出: false

示例 5:

输入: “{[]}”
输出: true

题目分析

  • 初始化栈 S。
  • 依次处理表达式的每个括号。
  • 如果遇到开括号,我们只需将其推到栈上即可。这意味着我们将稍后处理它,让我们简单地转到前面的 子表达式。
  • 如果我们遇到一个闭括号,那么我们检查栈顶的元素。如果栈顶的元素是一个 相同类型的 左括号,那么我们将它从栈中弹出并继续处理。否则,这意味着表达式无效。
  • 如果到最后我们剩下的栈中仍然有元素,那么这意味着表达式无效。

示例代码(java)

class Solution {
    public boolean isValid(String s) {
        int len = s.length();	// 字符串的长度
        if(len == 0)			// 如果为空,则为true
            return true;

        Stack<Character> sta = new Stack<>();	// 保存数据的栈
        
        // 遍历
        for(int i = 0; i < len; i++){
            char c = s.charAt(i);
			// 如果是左括号,则压入栈!如果是右括号,有两种情况返回false
			// 一是栈为空,二是栈顶元素与case的值不相等
            switch(c){
                case '(':
                case '[':
                case '{':
                    sta.push(c);
                    break;
                case ')':
                    if (sta.isEmpty() || sta.pop() != '(')
                        return false;
                    break;
                case ']':
                    if (sta.isEmpty() || sta.pop() != '[')
                        return false;
                    break;
                case '}':
                    if (sta.isEmpty() || sta.pop() != '{')
                        return false;
                    break;
            }
        }
		// 最后返回栈是否为空即可
        return sta.isEmpty();
    }
}

官方写法
ps:据作者对比,其实也没多大差别,就是使用了mapping来保存括号对,扩展性更强,可读性更好。

class Solution {
	// 负责映射的hash表
    private HashMap<Character, Character> mapping;
	
	// 初始化map,让代码更具有可读性
    public Solution(){
        this.mapping = new HashMap<Character, Character>();
        this.mapping.put(')', '(');
        this.mapping.put(']', '[');
        this.mapping.put('}', '{');
    }

    public boolean isValid(String s) {
    	// 保存左括号的栈
        Stack<Character> stack = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            // 如果发现右括号,有两种情况返回false
			// 一是栈为空,二是栈顶元素与映射的value值不相等
			// 代码中判断栈为空后赋值为’#‘,在进行值判断
            if (this.mapping.containsKey(c)){
                char topElement = stack.isEmpty()?'#':stack.pop();
                if (topElement != this.mapping.get(c))
                    return false;
            }else {
                stack.push(c);
            }

        }
        return stack.isEmpty();
    }
}

可以关注:自由的小黑!一起来学习,进步
括号匹配,看这一篇就够了_编程开发