刚拿到这个题没有头绪,感觉好难啊(自己做题少,经验少)
我就死看答案,啥也看不懂!!!
后来自己研究,包括查看B站找到了思路
刚开始我的思路很乱总想着括号同时从两边添加,左右开弓,这样是很不好思考的
思路图解(借的B站的图,我自己画的太丑了):
代码:
public static void main(String[] args) {
int n = 3;
System.out.println(generateParenthesis(n));
}
public static List<String> generateParenthesis(int n) {
List<String> ans = new ArrayList<>();
StringBuilder cur = new StringBuilder();
back(ans,cur,0,0,n);
return ans;
}
public static void back(List<String> ans,StringBuilder cur,int left,int right,int n){
if(cur.length() == 2 * n){
ans.add(cur.toString());
return;
}
if(left < n){//左括号数量小于n
cur.append("(");
back(ans,cur,left+1,right,n);
//System.out.println(cur.deleteCharAt(cur.length() - 1));
cur.deleteCharAt(cur.length() - 1);
}
if (right < left) {//右括号数量小于左括号
cur.append(')');
back(ans, cur, left, right + 1, n);
//System.out.println(cur.deleteCharAt(cur.length() - 1));
cur.deleteCharAt(cur.length() - 1);
}
}
代码中的两个if中都有一段相同的代码:cur.deleteCharAt(cur.length() - 1);
这断代码的意思是什么?
其实就是一次递归完成后回溯用的
大家可以debug一步一步的跟一下,就理解了