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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:05:10