当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时生成"()()"的完整路径:
- 初始调用:
solve(2, 0, 0, "", ans)- 此时
open=0 < 2,先添加左括号,s变为"(",进入递归调用solve(2,1,0,"(",ans)
- 此时
- 进入
solve(2,1,0,"(",ans):- 代码会先执行第一个if分支(添加左括号,生成
"(())"的路径),当这条分支执行完并回溯回来后,回到当前状态:s还是"(",open=1、close=0 - 此时执行第二个if分支:因为
open>close(1>0),添加右括号,s变为"()",进入递归调用solve(2,1,1,"()",ans)
- 代码会先执行第一个if分支(添加左括号,生成
- 进入
solve(2,1,1,"()",ans):- 此时
open=1 < 2,添加左括号,s变为"()(",进入递归调用solve(2,2,1,"()(",ans)
- 此时
- 进入
solve(2,2,1,"()(",ans):open已经等于n(2=2),第一个if不执行;但open>close(2>1),添加右括号,s变为"()()",进入递归调用solve(2,2,2,"()()",ans)
- 进入
solve(2,2,2,"()()",ans):- 满足
open==close==n的终止条件,将"()()"加入结果数组,返回。
- 满足
递归的回溯机制是关键:每一条分支执行完毕后,会回到上一层的状态,继续探索其他合法的分支,这样就能遍历所有符合规则的括号组合。
内容的提问来源于stack exchange,提问作者vagabond
相关产品推荐
相关产品推荐

