Description
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
Examples
input: 3
output: [ “((()))”, “(()())”, “(())()”, “()(())”, “()()()” ]
解题思路
想着就是把所有的可能性都求出来,然后用21问的方法去判断是否合理。
“ 求出所有可能性 ” 这一步想了很久,最后用了上一问最后说要考虑的递归hhhhh
每次递归的参数有:左括号还剩多少个,右括号还剩多少个,当前字符串是什么,存放所有可能答案的List
递归终止条件就是左括号没了,或者右括号比左括号少了(如果少了那就意味着有个右括号在没有左括号搭伴的情况下出现了!那肯定不合理)
代码如下:
class Solution {
public Boolean Judge(String s){
Stack<Character> st = new Stack<>();
int i;
for(i = 0; i < s.length(); i++){
if(s.charAt(i) == '(')
st.push(s.charAt(i));
else{
if(st.empty())
return false;
st.pop();
}
}
if(st.empty())
return true;
return false;
}
public void generateAll(int left_remain, int right_remain, String s, List<String>answer){
int i;
if(left_remain == 0){
for(i = 0; i < right_remain; i++)
s += ")";
answer.add(s);
return;
}
if(right_remain < left_remain){
return;
}
s += "(";
generateAll(left_remain - 1, right_remain, s, answer);
s = s.substring(0, s.length() - 1) + ')';
generateAll(left_remain, right_remain - 1, s, answer);
}
public List<String> generateParenthesis(int n) {
int i;
List<String> answer = new ArrayList<>();
List<String> all = new ArrayList<>();
String temp = "";
generateAll(n, n, temp, all);
for(i = 0; i < all.size(); i++)
if(Judge(all.get(i)))
answer.add(all.get(i));
return answer;
}
}
其他
- 这次一如既往去看了solution,意外的发现和solution差不多欸嘿有点小开心
- 和solution的时间有差距,应该是 String 和 char [ ] 对取值时间不同的锅
- 不过solution的代码好短QuQ
- 继续!