【leetcode】Generate Parentheses
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
For example, given n = 3, a solution set is:
"((()))", "(()())", "(())()", "()(())", "()()()"
题解:运用递归的思想,每一次可以放置一个左括号或者一个右括号(右括号放置有约束),然后递归进行后面的放置。n=2的情况如下图所示:
代码如下:
1 class Solution { 2 public: 3 vector<string> generateParenthesis(int n) { 4 vector<string> answer; 5 string s = ""; 6 recursive(answer,n,n,s); 7 8 return answer; 9 } 10 void recursive(vector<string>& answer,int leftp,int rightp,string s){ 11 if(leftp == 0 && rightp == 0) 12 answer.push_back(s); 13 if(leftp > 0) 14 { 15 recursive(answer,leftp-1,rightp,s+'('); 16 } 17 if(rightp >0 && leftp < rightp) 18 { 19 recursive(answer,leftp,rightp-1,s+')'); 20 } 21 } 22 };
上述代码中有一点要注意的就是在递归的过程中三个if不是互相独立的关系,就是说不是每次只进一个if,有可能从第一个if递归调用返回以后还要进入下一个if,所以在递归调用过程中不能改变s,leftp或者rightp的值,而只能在传递参数的时候体现出变化。如果把上述第二个if写成如下形式,就会发生错误:
1 if(leftp > 0) 2 { 3 s += '(' 4 recursive(answer,leftp-1,rightp,s); 5 }
因为这样从第二个if递归返回后再进入第三个if的时候s已经多加了一个'(',不是最初进入函数时候的s了。
JAVA版本代码:
1 public class Solution { 2 public List<String> generateParenthesis(int n) { 3 StringBuffer current = new StringBuffer(); 4 generateHelper(current, 0, 0,n); 5 return answer; 6 } 7 List<String> answer = new ArrayList<String>(); 8 private void generateHelper(StringBuffer current,int leftp,int rightp,int n){ 9 if(leftp == n && rightp == n) 10 { 11 String temp = current.toString(); 12 answer.add(temp); 13 return; 14 } 15 16 if(leftp < n){ 17 current.append('('); 18 generateHelper(current, leftp+1, rightp,n); 19 current.deleteCharAt(current.length()-1); 20 } 21 22 if(rightp < n && rightp < leftp){ 23 current.append(')'); 24 generateHelper(current, leftp, rightp+1,n); 25 current.deleteCharAt(current.length()-1); 26 } 27 } 28 }
分类:
leetcode刷题总结
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了