JavaScript括号验证函数循环重置问题求助
括号有效性验证问题的解决方案
你的代码核心问题分析
i=0重置无效:for循环每次迭代结束会自动执行i++,所以你在if分支里设置i=0后,下一轮循环i会直接变成1,无法实现从头遍历数组的目的。- 无返回值导致无法判断结果:
validPair函数没有返回最终的验证结果,validParentheses调用它后也没有返回值,最后无法输出true/false。 - 循环逻辑易陷入死循环:如果数组里始终存在可匹配的括号对,你的for循环会因为反复修改数组长度而出现无限循环的情况。
修复你当前的思路(反复删除相邻匹配对)
如果坚持用“反复删除相邻()”的思路,可以把for循环改成while循环+单次遍历检查,每次删除一对后就从头开始重新检查,直到没有可删除的匹配对为止:
const validPair = (parens) => { let hasChanged; // 循环直到没有匹配对可删除 do { hasChanged = false; for (let i = 0; i < parens.length; i++) { if (parens[i] === '(' && parens[i + 1] === ')') { parens.splice(i, 2); hasChanged = true; break; // 删除后立刻跳出for循环,从头开始检查 } } } while (hasChanged); // 最终数组为空则说明所有括号都匹配 return parens.length === 0; }; function validParentheses(parens) { let balance = 0; const arr = parens.split(''); // 快速校验:中途右括号数量超过左括号直接返回false for (const char of arr) { if (char === '(') balance++; else balance--; if (balance < 0) return false; } // 总数量不相等直接返回false if (balance !== 0) return false; // 调用验证函数并返回结果 return validPair(arr); } console.log(validParentheses('(()))(()')); // 输出false
更高效的标准解法:栈实现
反复修改数组的方法效率偏低,括号验证的标准解法是用栈结构,逻辑更清晰且时间复杂度为O(n):
function validParentheses(parens) { const stack = []; for (const char of parens) { if (char === '(') { // 左括号入栈 stack.push(char); } else { // 右括号出现时,栈为空说明没有匹配的左括号 if (stack.length === 0) return false; // 弹出最近的左括号,表示匹配成功 stack.pop(); } } // 最终栈为空则所有括号都匹配 return stack.length === 0; } // 测试用例 console.log(validParentheses("()")); // true console.log(validParentheses(")(()))")); // false console.log(validParentheses("(")); // false console.log(validParentheses("((()))((()())())")); // true
这个方法的逻辑是:遇到左括号就压入栈,遇到右括号就弹出栈顶的左括号(表示这一对匹配)。如果遇到右括号时栈为空,说明没有对应的左括号,直接返回false;遍历结束后栈为空则说明所有括号都匹配成功。
内容的提问来源于stack exchange,提问作者Wojtek1911
相关产品推荐
相关产品推荐

