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:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]利用动态规划的思想,递归求的结果
C++ O(n) solutioin
class Solution { public: vector<string> generateParenthesis(int n) { vector<string> res(1, "("); vector<int> left(1, 1); int l=2*n; for(int i=1; i<l; i++) { for(int j=res.size()-1; j>=0; j--) { if(left[j]>0) { if(left[j]<l-i) { res.emplace_back(res[j]+"("); left.push_back(left[j]+1); } res[j]+=")"; left[j]--; } else { res[j]+="("; left[j]++; } } } return res; } };这个思路没有利用递归求,而是写了一个vector记录左括号的次数,利用循环来做,很有意思。
Java O(n) solution
public List<String> generateParenthesis(int n) { List<String> list = new ArrayList<String>(); backtrack(list, "", 0, 0, n); return list; } public void backtrack(List<String> list, String str, int open, int close, int max){ if(str.length() == max*2){ list.add(str); return; } if(open < max) backtrack(list, str+"(", open+1, close, max); if(close < open) backtrack(list, str+")", open, close+1, max); }也是利用递归,只是编程方法而已。
python O(n) solution
def generateParenthesis(self, n): def generate(p, left, right, parens=[]): if left: generate(p + '(', left-1, right) if right > left: generate(p + ')', left, right-1) if not right: parens += p, return parens return generate('', n, n) def generateParenthesis(self, n, left=0, right=0, cur=''): if left == n: return [cur + ')' * (n - right)] if left == right: return self.generateParenthesis(n, left + 1, right, cur + '(') return self.generateParenthesis(n, left + 1, right, cur + '(') \ + self.generateParenthesis(n, left, right + 1, cur + ')')