- 思路1:
这个题目也要从简单的例子入手,然后发现规律。
1 ()
2 ()(),(())
3 ()()(), (())(), (()()), ()(()), ((()))
规律是这样的 ,假设我们已经产生了n-1对括号的所有组合,那么在这个基础上我们可以产生所有的n对括号的组合,我们把一个(放在每个n-1对括号组合的开头,然后在每个每一个括号配好对的位置插入一个)。这样我们就产生了一个n对括号的组合。
- 思路2:
主要用到了递归的思想,递归时保证字符串中左括号数大于等于右括号数即可。
1. 如果左括号数还没有用完,那么我们能继续放置左括号
2. 如果已经放置的左括号数大于已经放置的右括号数,那么我们可以放置右括号 (如果放置的右括号数大于放置的左括号数,会出现不合法组合)
所以,运用dfs在每一层递归中,如果满足条件先放置左括号,如果满足条件再放置右括号
package leetcode.doit;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class GenerateParentheses_my {
public static void main(String[] args) {
ArrayList ret = (ArrayList) generateParenthesis(3);
// Iterator<String> it = ret.iterator();
// while (it.hasNext()) {
// System.out.println(it.next());
// }
}
static List<String> generateParenthesis(int n) {
List<String> result = new ArrayList<String>();
if (n <= 0)
return result;
String s = new String();
dfs(0, 0, n, s, result);
return result;
}
public static void dfs(int left, int right, int n, String s,
List<String> result) {
System.out.println(s);
if (left == n && left == right) {
result.add(s);
return;
}
if (left < n)
dfs(left + 1, right, n, s + "(", result);
if (right < left) {
dfs(left, right + 1, n, s + ")", result);
}
}
}