原题链接:https://leetcode.com/problems/generate-parentheses/description/
思路:
这道题要求出n对括号能够正确排列的所有情况,重点是要找到符合条件排列的特点。我们可以将长度为2n的排列,看成是n个(与n个)一次次从左往右拼接而成。如果,这个排列是合理的,那么它有着如下的特点:
1. 在拼接符号的过程中,(的个数一定是小于等于)个数的。一旦出现)的个数大于(的情况,比如(())()),因为前6个符号已经匹配,可以等效为),后面哪怕再拼接(,也只会出现)(的情况,无济于事。
2.在拼接符号的过程中,(的个数一定要小于n,这个比较好理解,因为最终合理的匹配排列由n个(与n个)组成。
3.在满足1,2俩点的情况下,一直拼接,直到拼接成的字符串长度==2n,说明拼接成功。
其实是一个DFS,从输出的顺序也可以看出。
综合以上的分析,通过递归来实现,满足条件的字符串放到容器中,拼接过程中一旦出现不符合1,2两点的字符串就直接放弃。
其中open与close代表着字符串中含有的左右括号的个数。
public class GenerateParentheses {
public List<String> generateParenthesis(int n) {
List<String> list = new ArrayList<String>();
backtrack(list, "", 0, 0, n);
return list;
}
private void backtrack(List<String> list, String str, int open, int close, int max) {
if(str.length() == 2*max) {
list.add(str);
return;
}
if(open < max) {
backtrack(list, str+"(", open+1, close, max);
}
if(close < open) {
backtrack(list, str+")", open, close+1, max);
}
}
}