问题描述:打印n对括号的全部有效组合。
例如输入:3
输出:((())),()()(),(())(),()(()),(()())
解题思路:可以用递推法,当n等于1时只有一种组合,当n等于2时有四种组合。慢慢类推可以发现:n=k的组合方式等于n=k-1的组合方式中每一个元素分别在左边,右边添加一个括号以及把原来的方式给括起来。也就是说当n+1时,原组合方式中的每一种形式都可以推出三种形式(左右添加以及把整个字符串括起来)。
不过上面的做法会出现重复的问题,解决这个问题可以用API中的set类;会自动去掉重复的元素。
递归代码如下:
import java.util.*;
public class 括号组合问题 {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
System.out.println(solve(n));
}
private static Set<String> solve(int n) {
//HashSet sn = new HashSet();
Set<String> sn = new HashSet();
if(n==1){
sn.add("()");
return sn;
}
Set<String> sn1 = solve(n-1);
for(String str: sn1){
sn.add(str+"()");
sn.add("()"+str);
sn.add("("+str+")");
}
return sn;
}
}
迭代形式代码如下:
import java.util.*;
public class 括号组合问题 {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
System.out.println(solve(n));
}
private static Set<String> solve(int n) {
Set<String> sn = new HashSet();
sn.add("()");
if(n==1) return sn;
for(int i=2; i<=n; i++){//从2开始,因为之前添加了一个括号了
Set<String> sn1 = new HashSet();
for(String str:sn){
sn1.add("()"+str);
sn1.add(str+"()");
sn1.add("("+str+")");
}
sn = sn1;
}
return sn;
}
}