看不太习惯书上写的递归,觉得没有自己写的清晰。
这道题唯一要满足的条件就是在任何时候,左括号数量一定要大等于右括号的数量。
package Recursion;
import java.util.HashSet;
import java.util.Set;
/**
*Implement an algorithm to print all valid (e.g., properly opened and closed) combinations of n-pairs of parentheses.
EXAMPLE:
input: 3 (e.g., 3 pairs of parentheses)
output: ((())), (()()), (())(), ()(()), ()()()
译文:
实现一个算法打印出n对括号的有效组合。
例如:
输入:3 (3对括号)
输出:((())), (()()), (())(), ()(()), ()()()
*
*
*/
public class S9_6 {
public static void main(String[] args) {
Set<String> list = generateParens(3);
for (String s : list) {
System.out.println(s);
}
System.out.println(list.size());
}
public static Set<String> generateParens(int n){
Set<String> set = new HashSet<String>();
rec(set, n, 0, 0, "");
return set;
}
public static void rec(Set<String> set, int n, int left, int right, String s){
if(right > left){ // 不合法的括号
return;
}
if(left==n && right==n){ // 成功找到一组
set.add(s);
return;
}
if(left>n || right>n){ // 越界情况
return;
}
rec(set, n, left+1, right, s+"("); // dfs
rec(set, n, left, right+1, s+")");
}
}