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; } }
逻辑错误分析
你的代码核心逻辑是假设括号必须相邻成对出现,完全不符合题目中“左括号必须以正确顺序闭合”的要求,具体错误点如下:
索引错误与配对逻辑颠倒
当输入"()"时,字符串长度为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。
数据类型不匹配
s.charAt()返回的是char类型,而你的map的key是String类型,map.containsKey(s.charAt(...))实际上是把char自动装箱为Character,和String类型的key永远不匹配,这也是导致输入合法字符串却返回false的关键问题。无法处理嵌套括号结构
题目允许合法的嵌套括号,比如"([])",但你的代码默认相邻位置的括号必须成对,这种嵌套结构会被错误判定为无效。完全忽略括号的顺序要求
对于"({})"这类合法的顺序闭合字符串,你的代码会检查第1位的'{'和第2位的'}',然后检查第3位的')',此时map.containsKey(')')不成立,直接返回false,完全违背了题目对括号顺序的要求。
内容的提问来源于stack exchange,提问作者frozenyoung
相关产品推荐
相关产品推荐

