Java 括号组合问题

问题描述:打印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;
	}
}
发布了45 篇原创文章 · 获赞 5 · 访问量 1938

猜你喜欢

转载自blog.csdn.net/HC199854/article/details/104307286