Leetcode第22题 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;
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逍遥自在”

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值