You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java有效括号判断代码逻辑错误排查:输入"()"为何返回false?

括号有效性判断函数的逻辑错误分析

需求说明

给定仅包含(、)、{、}、[、]的字符串s,判断该字符串是否有效。有效字符串需满足:

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

示例

  • 输入:s = "()" → 输出:true
  • 输入:s = "()[]{}" → 输出:true
  • 输入:s = "(]" → 输出:false

问题现象

测试输入"()"时,代码返回false,以下是对应的代码:

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

class Solution {
    public boolean isValid(String s) {
        Map<String, String> map = Map.of("(",")","[","]","{","}");

        if (s.length() % 2 != 0) {
            return false;
        }

        for (int index = 0; index < s.length() / 2; index++) {
            if (!map.containsKey(s.charAt(2 * index + 1))) {
                return false;
            } else {
                if (!map.get(s.charAt(2 * index + 1)).equals(s.charAt(2 * index + 2))) {
                    return false;
                }
            }
        }
        return true;
    }
}

逻辑错误分析

你的代码核心逻辑是假设括号必须相邻成对出现,完全不符合题目中“左括号必须以正确顺序闭合”的要求,具体错误点如下:

  1. 索引错误与配对逻辑颠倒
    当输入"()"时,字符串长度为2,s.length()/2等于1,循环执行1次:

    • index=0时,2*index+1 = 1,s.charAt(1)是')',而你的map的key是左括号((、[、{),所以map.containsKey(')')直接返回false,这就是输入"()"返回错误结果的直接原因。
      另外,代码中使用2*index+2作为索引,当index接近s.length()/2时,这个索引会超出字符串长度范围,触发StringIndexOutOfBoundsException。
  2. 数据类型不匹配
    s.charAt()返回的是char类型,而你的map的key是String类型,map.containsKey(s.charAt(...))实际上是把char自动装箱为Character,和String类型的key永远不匹配,这也是导致输入合法字符串却返回false的关键问题。

  3. 无法处理嵌套括号结构
    题目允许合法的嵌套括号,比如"([])",但你的代码默认相邻位置的括号必须成对,这种嵌套结构会被错误判定为无效。

  4. 完全忽略括号的顺序要求
    对于"({})"这类合法的顺序闭合字符串,你的代码会检查第1位的'{'和第2位的'}',然后检查第3位的')',此时map.containsKey(')')不成立,直接返回false,完全违背了题目对括号顺序的要求。


内容的提问来源于stack exchange,提问作者frozenyoung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 10:22:19