Generate Parentheses
lc 22
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
进入循环两种可能,一种 add left parens, 另一个是加右括号。如果加左括号,要保证左括号数量不为0,要是加右括号,要保证当前右边少于左边,否则加上去的是invalid的
public class Solution {
public List<String> generateParenthesis(int n) {
List<String> res = new ArrayList<String>();
helper(n, n, "", res);
return res;
}
public void helper(int leftn, int rightn, String valid, List<String> result){
if( leftn == 0 && rightn == 0){
result.add(valid);
return;
}
if (leftn > 0) {
helper(leftn - 1, rightn, valid + "(",result );
}
if (rightn > 0 && leftn < rightn) {
helper(leftn , rightn - 1, valid + ")", result);
}
}
}
错误做法: (())(()) 情况下不成立,因为我想的是() +下一个, 下一个+() (下一个)三种情况。所以不成立
//错误做法
public class Solution {
public List<String> generateParenthesis(int n) {
List<String> res = new ArrayList<String>();
if( n == 0) return res;
HashMap<Integer, List<String>> map = new HashMap<Integer, List<String>>();
return helper(map, n );
}
public List<String> helper(HashMap<Integer, List<String>> map, int n){
if( n == 0){
if( !map.containsKey(n)){
List<String> list = new ArrayList<>();
list.add("");
map.put(0, list);
}
return map.get(n);
}
if(map.containsKey(n)){
return map.get(n);
}
List<String> res = new ArrayList<>();
List<String> cur = helper(map, n - 1);
for(String s : cur){
if( ! res.contains("()" + s)){
res.add("()" + s);
}
if( ! res.contains( s + "()")){
res.add(s + "()");
}
if(! res.contains("(" + s + ")")){
res.add("(" + s + ")");
}
}
map.put(n, res);
return res;
}
}