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

当n=2时,这段合法括号生成代码如何得到"()()"?

合法括号生成代码的逻辑解析

先贴出问题中的代码:

void solve(int n,int open,int close,string s,vector<string>&ans) {
    if(open==close && close==n) {
        ans.push_back(s);
        return;
    }
    if(open<n) {
        s+="(";
        solve(n,open+1,close,s,ans);
        s.pop_back();
    }
    if(open>close) {
        s+=")";
        solve(n,open,close+1,s,ans);
        s.pop_back();
    }
}
vector<string> generateParentheses(int n) {
    vector<string> ans;
    solve(n,0,0,"",ans);
    return ans;
}

你的误解在于认为必须等左括号数量达到n才能闭合,但代码的核心逻辑是只要当前左括号数量大于右括号,就可以添加右括号,不需要等到左括号满n。下面手动推演n=2时生成"()()"的完整路径:

  1. 初始调用:solve(2, 0, 0, "", ans)
    • 此时open=0 < 2,先添加左括号,s变为"(",进入递归调用solve(2,1,0,"(",ans)
  2. 进入solve(2,1,0,"(",ans):
    • 代码会先执行第一个if分支(添加左括号,生成"(())"的路径),当这条分支执行完并回溯回来后,回到当前状态:s还是"(",open=1、close=0
    • 此时执行第二个if分支:因为open>close(1>0),添加右括号,s变为"()",进入递归调用solve(2,1,1,"()",ans)
  3. 进入solve(2,1,1,"()",ans):
    • 此时open=1 < 2,添加左括号,s变为"()(",进入递归调用solve(2,2,1,"()(",ans)
  4. 进入solve(2,2,1,"()(",ans):
    • open已经等于n(2=2),第一个if不执行;但open>close(2>1),添加右括号,s变为"()()",进入递归调用solve(2,2,2,"()()",ans)
  5. 进入solve(2,2,2,"()()",ans):
    • 满足open==close==n的终止条件,将"()()"加入结果数组,返回。

递归的回溯机制是关键:每一条分支执行完毕后,会回到上一层的状态,继续探索其他合法的分支,这样就能遍历所有符合规则的括号组合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:17:23