leetcode判断一个括号字符串是否是合法的

问题描述

描述:Valid Parentheses 题目地址

Example

输入: “{()}[]” -> true
输入: “({)}[]” -> false
输入: “[]” -> true
输入: “” -> true

思路分析

使用栈结构来处理

栈介绍:** 先进后出(FILO), 例如子弹夹, 将元素放入栈中叫压栈 将元素从栈中弹出叫出栈

以字符串 {()} 为例:

1, 第一个元素 { 入栈
2, 第二个元素 ( 判断和栈顶的元素不匹配, 也将其压入栈中
3, 第三个元素 )栈顶元素匹配, 所以将栈顶元素弹出, 然后栈中只剩下 {
4, 第四个元素 } 和现在的栈顶元素匹配, 所以也将栈顶元素弹出, 现在为空栈
5, 返回结果: 括号字符串是合法的

example

代码实现

package com.alan.leetcode;

import java.util.HashMap;
import java.util.Map;
import java.util.Stack;

public class ValidParentheses {
    public static void main(String[] args) {
        Solution solution = new Solution();
        boolean result = solution.isValid("[({)]");
        System.out.println(result);
    }
}

class Solution {
    static Map<Character, Character> map = new HashMap<>(3);

    static {
        map.put(')', '(');
        map.put(']', '[');
        map.put('}', '{');
    }
    public boolean isValid(String s) {
        // 字符串转换为字符数组
        char[] chars = s.toCharArray();
        Stack<Character> stack = new Stack<>();
        for (char aChar : chars) {
            // 查看栈顶的是否匹配
            if (stack.empty()) {
                stack.push(aChar);
                continue;
            }
            if (map.get(aChar) != null && map.get(aChar).equals(stack.peek())) {
                stack.pop();
            } else {
                stack.push(aChar);
            }
        }
        return chars.length > 0 && stack.empty();
    }
}

源码地址