题目:
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:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]
解法1:递归法 参考LeetCode 刷题记录 17. Letter Combinations of a Phone Number
递归函数参数为左括号和右括号的数目 当左右括号为n时,递归结束
注意剪枝:右括号的数目大于左括号的数目时,不是有效的括号组合,如"())",应予以排除,另外注意左右括号不应超过n
c++:
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> res;
DFS(0, 0, "", n, res);
return res;
}
void DFS(int left, int right, string path, int n, vector<string>& res){
if(right > left || left > n || right > n) return;
if(left == n && right == n){
res.push_back(path);
return;
}
DFS(left + 1, right, path + '(', n, res);
DFS(left, right + 1, path + ')', n, res);
}
};
java:
class Solution {
public List<String> generateParenthesis(int n) {
List<String> res = new ArrayList<>();
DFS(0, 0, "", n, res);
return res;
}
public void DFS(int left, int right, String path, int n, List<String> res){
if(right > left || left > n || right > n) return;
if(left == n && right == n){
res.add(path);
return;
}
DFS(left + 1, right, path + '(', n, res);
DFS(left, right + 1, path + ')', n, res);
}
}
Python:
class Solution(object):
def generateParenthesis(self, n):
"""
:type n: int
:rtype: List[str]
"""
res = []
self.DFS(0, 0, "", n, res)
return res
def DFS(self, left, right, path, n, res):
if right > left or left > n or right > n: return;
if left == n and right == n:
res.append(path);
return;
self.DFS(left + 1, right, path + '(', n, res)
self.DFS(left, right + 1, path + ')', n, res)
解法2:动态规划法
f(0): “”
f(1): “(“f(0)”)”
f(2): "(“f(0)”)"f(1), “(“f(1)”)”
f(3): "(“f(0)”)"f(2), "(“f(1)”)"f(1), “(“f(2)”)”
So f(n) = "(“f(0)”)"f(n-1) , "(“f(1)”)"f(n-2) "(“f(2)”)"f(n-3) … "(“f(i)”)“f(n-1-i) … “(f(n-1)”)”(An iterative method.)
dp[0] = “”
dp[i]=’(’+ dp[k]+’)’+dp[i-1-k],k=0…i-1(A simplified c++ DP solution, 4ms, 8 lines)
c++:
内层用vector 外层可以用数组也可以继续用vector
vector初始化用(),第一个参数是数量,第二个参数是值
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector< vector<string> > dp(n + 1, vector<string>());
//vector<string> dp[n + 1];
dp[0].push_back("");
for(int i = 1; i <= n; i++){
for(int k = 0; k < i;k++){
for(string s2: dp[i-1-k]){
for(string s1: dp[k]){
dp[i].push_back("(" + s1 + ")" + s2);
}
}
}
}
return dp[n];
}
};
java:
- 采用数组方式实现 必须new List[n + 1]而不是ArrayList 因为Collections.singletonList和 Arrays.asList返回List
Arrays.asList使用指南
singletonList()方法实例 - 在进行add操作必须要创建实例 如List temp = new ArrayList<>();不能直接对dp[i] 进行add操作,会出现空指针异常
class Solution {
public List<String> generateParenthesis(int n) {
List<String> dp[] = new List[n + 1];
dp[0] = Collections.singletonList("");
//dp[0] = Arrays.asList("");
for(int i = 1; i <= n; i++){
List<String> temp = new ArrayList<>();
for(int k = 0; k < i;k++){
for(String s1: dp[k]){
for(String s2: dp[i-1-k]){
temp.add("(" + s1 + ")" + s2);
}
}
}
dp[i] = temp;
}
return dp[n];
}
}
在嵌套List
class Solution {
public List<String> generateParenthesis(int n) {
List<List<String>>dp = new ArrayList<>();
//dp.add(Collections.singletonList(""));
dp.add(Arrays.asList(""));
for(int i = 1; i <= n; i++){
List<String> temp = new ArrayList<>();
for(int k = 0; k < i;k++){
for(String s1: dp.get(k)){
for(String s2: dp.get(i-1-k)){
temp.add("(" + s1 + ")" + s2);
}
}
}
dp.add(temp);
}
return dp.get(dp.size() - 1);
}
}
python:
最后dp[i] += 而不是=
class Solution(object):
def generateParenthesis(self, n):
"""
:type n: int
:rtype: List[str]
"""
dp = [[] for i in range(n + 1)]
dp[0].append("")
for i in range(1, n + 1):
for k in range(i):
dp[i] += ["(" + x + ")" + y for x in dp[k] for y in dp[i - 1 - k]]
return dp[n]