题目

/**
 * @Author hang.wang
 * @Date 2023/11/24 10:22
 * <p>
 * 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
 * <p>
 * 有效字符串需满足:
 * <p>
 * 左括号必须用相同类型的右括号闭合。
 * 左括号必须以正确的顺序闭合。
 * 每个右括号都有一个对应的相同类型的左括号。
 * <p>
 * <p>
 * 示例 1:
 * 输入:s = "()"
 * 输出:true
 * <p>
 * 示例 2:
 * 输入:s = "()[]{}"
 * 输出:true
 * <p>
 * 示例 3:
 * 输入:s = "(]"
 * 输出:false
 * <p>
 * 提示:
 * 1 <= s.length <= 104
 * s 仅由括号 '()[]{}' 组成
 */

代码

public class Class20 {

    public static void main(String[] args) {
        Class20 class20 = new Class20();
        System.out.println(class20.isValid("([)]"));
        System.out.println(class20.isValid("()"));
        System.out.println(class20.isValid("()[]{}"));
        System.out.println(class20.isValid("(]"));
    }

    public char exchange(char c) {
        switch (c) {
            case '(':
                return ')';
            case ')':
                return '(';
            case '[':
                return ']';
            case ']':
                return '[';
            case '{':
                return '}';
            case '}':
                return '{';
        }
        return ' ';
    }

    public boolean isValid(String s) {
        if (s.length() % 2 != 0) {
            return false;
        }
        if (s.length() == 1) {
            if (isPost(s.charAt(0))) {
                return false;
            }
        }
        Deque<Character> queue = new ArrayDeque<>();

        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (isPost(c)) {
                try {
                    Character remove = queue.removeFirst();
                    if (exchange(c) != remove) {
                        return false;
                    }
                } catch (Exception e) {
                    return false;
                }
            } else {
                queue.addFirst(c);
            }
        }

        return queue.isEmpty();
    }

    public boolean isPost(char c) {
        switch (c) {
            case ')':
            case ']':
            case '}':
                return true;
        }
        return false;
    }
}

解析

利用堆栈的特性,如果判断是前括号,就存进去,如果是后括号,就取出来一个值,然后判断这俩是否匹配

最后修改:2023 年 12 月 25 日
如果觉得我的文章对你有用,请随意赞赏