一天一道算法题day04

文章目录

  • 题目概述
  • 错误解题
  • 正确解题
  • 小结

题目概述

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

错误题解

暴力解法但忽略了左括号必须以正确的顺序闭合。

class Solution {
    public boolean isValid(String s) {
        int a = 0;  // 记录圆括号 ()
        int b = 0;  // 记录大括号 {}
        int c = 0;  // 记录方括号 []
        int len = s.length();
        
        for (int i = 0; i < len; i++) {
            char ch = s.charAt(i);  // 使用 char 而非 String
            
            if (ch == '(') {
                a += 1;
            } else if (ch == ')') {
                a -= 1;
                if (a < 0) return false;  // 如果关闭括号过早出现,返回 false
            } else if (ch == '{') {
                b += 1;
            } else if (ch == '}') {
                b -= 1;
                if (b < 0) return false;  // 同理,处理大括号
            } else if (ch == '[') {
                c += 1;
            } else if (ch == ']') {
                c -= 1;
                if (c < 0) return false;  // 处理方括号
            }
        }
        
        // 如果所有括号都匹配,a, b, c 应该都为 0
        return a == 0 && b == 0 && c == 0;
    }
}

正确题解

正确的判断方式:

括号不仅要数量匹配,还必须确保闭合的顺序是正确的。因此,这个问题需要使用来解决。当你遇到左括号时,将其压入栈中;当遇到右括号时,检查栈顶是否是对应的左括号,如果匹配则弹出栈顶。如果所有括号处理完毕后栈为空,说明括号匹配,否则说明不匹配。

class Solution {
    public boolean isValid(String s) {
        int n = s.length();
        if (n % 2 == 1) {
            return false;
        }

        Map<Character, Character> pairs = new HashMap<Character, Character>() {{
            put(')', '(');
            put(']', '[');
            put('}', '{');
        }};
        Deque<Character> stack = new LinkedList<Character>();
        for (int i = 0; i < n; i++) {
            char ch = s.charAt(i);
            if (pairs.containsKey(ch)) {
                if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {
                    return false;
                }
                stack.pop();
            } else {
                stack.push(ch);
            }
        }
        return stack.isEmpty();
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/valid-parentheses/solutions/373578/you-xiao-de-gua-hao-by-leetcode-solution/
来源:力扣(LeetCode)

小结

  • 括号匹配问题不仅需要数量匹配,还需要确保顺序和嵌套是正确的。
  • 解决这类问题时,应该使用数据结构来记录每个打开的括号,依次匹配关闭的括号。

通过这些分析可以理解到,仅依赖计数器的方式不适合解决这种嵌套结构的验证问题,栈是更合适的工具。

  • 13
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值