Ruby括号匹配校验函数问题排查:现有代码无法正常运行
括号有效性判断函数的错误分析与修正方案
错误原因分析
- 核心逻辑完全偏离需求:你当前的思路是拿原字符串和反转后的字符串逐位比对,判断对应位置是不是成对括号,但这根本不是括号有效性的判断逻辑。比如有效用例
"([{}])"反转后是")}{][(",原字符串第1位是[,反转后第1位是},这时候你的代码会往数组里加0,最终判断为无效,完全和预期相反。 - 循环终止条件错误:
break if i <= braces.length这个条件会让循环多执行一次,当i等于字符串长度时,braces[i]是nil,会导致后续的判断全部触发else分支加0,干扰结果。 - 返回值不符合要求:你用
puts打印结果,但题目要求函数返回布尔值,这样调用validBraces("()")得到的是nil而不是true,完全不符合需求。 - 冗余判断导致结果混乱:每个字符会触发6次判断,只要有一次不匹配就加0,最终数组里会混进大量无效的0,根本没法正确反映括号的匹配情况。
修正方案
括号匹配的标准解法是用栈:遇到左括号就压入栈,遇到右括号就检查栈顶是不是对应的左括号——匹配就弹出栈顶,不匹配直接返回false;遍历完所有字符后,栈为空说明所有括号都正确闭合,返回true,否则返回false。
修正后的代码:
def validBraces(braces) stack = [] # 用哈希存右括号到对应左括号的映射 brace_pairs = { ')' => '(', '}' => '{', ']' => '[' } braces.each_char do |char| if brace_pairs.key?(char) # 遇到右括号,栈空或者栈顶不匹配直接返回false return false if stack.empty? || stack.pop != brace_pairs[char] else # 左括号直接入栈 stack << char end end # 遍历结束后栈必须为空才是有效括号 stack.empty? end
测试验证
把给定的测试用例代入:
"(){}[]"→ 返回true"([{}])"→ 返回true"(}"→ 返回false"[(])"→ 返回false"[({})](]"→ 返回false
所有用例都符合预期。
内容的提问来源于stack exchange,提问作者R4V3N
相关产品推荐
相关产品推荐

