LeetCode刷题记45
22. 括号生成
class Solution {
public Set<String> F(int n) {
Set<String> ans = new HashSet<String>();
if (n == 1) {
ans.add("()");
} else {
for (int i = 1; i <= n / 2; i ++) {
Set<String> tmp1 = F(i);
Set<String> tmp2 = F(n - i);
for (String s1 : tmp1) {
for (String s2 : tmp2) {
ans.add(s1 + s2);
ans.add(s2 + s1);
}
}
}
Set<String> tmp = F(n - 1);
for (String s : tmp) {
ans.add("(" + s + ")");
}
}
return ans;
}
public List<String> generateParenthesis(int n) {
return new ArrayList<String>(F(n));
}
}
回溯写法,下午好歹捋清了一个,我去看看别人怎么写的,感觉我的效率有点低。我发现我的感觉不是回溯,好像是动态规划。。
class Solution {
public void F(int l, int r, int n, String s, List<String> ans) {
if (l > n || r > l) { //超出长度限制或者右括号的个数大于左括号的个数
return;
}
if (l == r && r == n) { //满足条件
ans.add(s);
return;
}
F(l + 1, r, n, s + "(", ans);
F(l, r + 1, n, s + ")", ans);
}
public List<String> generateParenthesis(int n) {
List<String> ans = new ArrayList<String>();
F(0, 0, n, "", ans);
return ans;
}
}
4/5
45/150