翻车现场,忘记了String才是传值,而stringbuffer/stringbuilder是传引用,导致调了半天的bug
String解法
import java.util.LinkedList;
import java.util.List;
class Solution {
public List<String> generateParenthesis(int n) {
List<String> ans = new LinkedList<>();
Recursion(ans,n,0,new String());
return ans;
}
//nowAddedLeft为已经增加的( 个数
public void Recursion(List<String> ans,int n,int AddedLeft,String sb) {
sb+='(';
int nowAddedLeft = AddedLeft + 1;
int nowRestLeft = n - nowAddedLeft;
int nowRestRight = 2 * n - sb.length() - nowRestLeft;
if(nowRestLeft == 0) {
for (int i = 0; i < nowRestRight ; i++) {
sb+=')';
}
ans.add(sb.toString());
} else {
Recursion(ans,n,nowAddedLeft,sb);
for(int i=nowRestLeft;i<=nowRestRight;i++){
sb+=')';
Recursion(ans,n,nowAddedLeft,sb);
}
}
}
}
标程的解法才是正道
class Solution {
public List<String> generateParenthesis(int n) {
List<String> ans = new ArrayList<String>();
backtrack(ans, new StringBuilder(), 0, 0, n);
return ans;
}
public void backtrack(List<String> ans, StringBuilder cur, int open, int close, int max) {
if (cur.length() == max * 2) {
ans.add(cur.toString());
return;
}
if (open < max) {
cur.append('(');
backtrack(ans, cur, open + 1, close, max);
cur.deleteCharAt(cur.length() - 1);
}
if (close < open) {
cur.append(')');
backtrack(ans, cur, open, close + 1, max);
cur.deleteCharAt(cur.length() - 1);
}
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/generate-parentheses/solution/gua-hao-sheng-cheng-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。