一开始用hashset 对于怎么从上一个情况准确找出加一个括号后的所有可能性,找不到正确的规律,我想的是
hashset.add("("+s+")");
hashset.add("()"+s);
hashset.add(s+"()");
但并没有涵盖所有的情况。就用了DP去做; P(n) = P(n-1-i).+ “P(i)”
代码:
public class Solution {
public List<String> generateParenthesis(int n) {
List<String> list = new ArrayList<>();
if(n < 1) return list;
return addParenthesis(n);
}
public List<String> addParenthesis(int index){
List<String> newList = new ArrayList<>();
if(index == 0){
newList.add("");
return newList;
}
if(index == 1){
newList.add("()");
return newList;
}
for(int k = 0; k < index; k++){
List<String> list_left = addParenthesis(index-1-k);
List<String> list_right = addParenthesis(k);
for(int i = 0; i < list_left.size(); i++){
String s_left = list_left.get(i);
for(int j = 0; j < list_right.size(); j++){
String s_right = list_right.get(j);
newList.add(s_left+"("+s_right+")");
}
}
}
return newList;
}
}
重新用Hashset 做:做是做出来了 但是runtime有点高。。
代码:
public class Solution {
public List<String> generateParenthesis(int n) {
List<String> list = new ArrayList<>();
if(n < 1) return list;
for(int i = 1; i <= n; i++){
list = addParenthesis(list);
}
return list;
}
public List<String> addParenthesis(List<String> list){
List<String> newList = new ArrayList<>();
Set<String> set = new HashSet<>();
int len = list.size();
if(len == 0){
newList.add("()");
return newList;
}
for(int i = 0; i < len; i++){
String s = list.get(i);
int str_len = s.length();
for(int j = 0; j < str_len - 1; j++){
set.add(s.substring(0,j+1) +"()"+s.substring(j+1,str_len));
}
set.add("()"+s);
set.add(s+"()");
}
newList = new ArrayList<>(set);
return newList;
}
}
Jan 15 - Generate Parentheses; DP; BackTracking; Recursion; Hash set;
原文:http://www.cnblogs.com/5683yue/p/5134883.html