打印n对括号的全部有效组合(左右括号正确匹配)Java实现
一、问题导出
今天在做算法题目的时候遇到了一道左右括号匹配的问题,问题如下:

二、问题思考
(1)这种要列出全部可能性的题目很容易想到由小到大去发现规律,用递归或者暴力搜索。
首先1的情况,一个括号只有一种可能,就是()
接着想2的情况,加个括号,可以在1的基础上加在其左边、右边或者包围住1,即()()、()()、(())去掉重复就剩下两种
同理3在2的基础上,都加上左边、右边、包住的括号
(2)用何种数据结构去存储括号呢?首先括号是字符串,再想到要去掉重复,所以想到用Hashset存储
三、代码实现
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
//递归
/*
Set<String> set=dp(n);
for (String string : set) {
System.out.println(string);
}*/
//正常逻辑
Set<String> set=getBracket(n);
for (String string : set) {
System.out.println(string);
}
}
private static Set<String> getBracket(int n) {
Set<String> set=new HashSet<String>();
set.add("()");
if(n==1){
return set;
}else{
for(int i=1;i<n;i++){
Set<String> newset=new HashSet<String>();
for (String string : set) {
newset.add("()"+string);
newset.add(string+"()");
newset.add("("+string+")");
}
set=newset;
}
return set;
}
}
//递归
public static Set<String> dp(int n){
Set<String> set=new HashSet<String>();
if(n==1){
set.add("()");
return set;
}else{
Set<String> set2=dp(n-1);
for (String string : set2) {
//左边加
set.add("()"+string);
//右边加
set.add(string+"()");
//包围住
set.add("("+string+")");
}
return set;
}
}
}
运行结果:

四、总结
虽然这题不算很难,但做题的思想还是很经典的,由小及大,所以还是记了下来巩固一下,还有就是在正常逻辑中用set时,不小心将
Set<String> newset=new HashSet<String>();这一行放到了双重循环之外,导致出现java.util.ConcurrentModificationException的异常,
因为之前看过书知道这种异常,但是自己打代码的时候还没有遇到过,既然遇到了,就要记录一下,免得下次再犯。
打印n对括号的全部有效组合(左右括号正确匹配)Java实现的更多相关文章
- 9.9递归和动态规划(六)——打印n对括号的所有有效组合(即左右括号正确配对)
/** * 功能:打印n对括号的所有有效组合(即左右括号正确配对). */ 两种方法: 方法一: /** * 思路:在括号的最前面或者原有的每对括号中面插入一对括号. 至于其它任何位置.比方字符串的 ...
- 面试编程题拾遗(06) --- 打印n对括号的全部有效组合
如题所述,当n=3时,可能的组合有:(()()), ((())), ()(()), (())(), ()()() 代码如下(有注释): import java.util.ArrayList; impo ...
- [LeetCode]678. 有效的括号字符串、20. 有效的括号(栈)
题目 678. 有效的括号字符串 给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串.有效字符串具有如下规则: 任何左括号 ( 必须有相应的右括号 ). 任何 ...
- 百度2014校园招聘算法——给出一组数据A=[a_0, a_1, a-2, ... a_n](当中n可变),打印出该数值元素的全部组合。
VC++ void StringTest(CString source, CStringArray& dest) { if(source.IsEmpty()) { } else { CStri ...
- Anton and School - 2 CodeForces - 785D (组合计数,括号匹配)
大意: 给定括号字符串, 求多少个子序列是RSGS. RSGS定义如下: It is not empty (that is n ≠ 0). The length of the sequence is ...
- 打印N个真值的所有真值组合
例:N=2 (true,true),(false,true),(true,false),(false,false) #include<stdio.h> int count=0; void ...
- P1739_表达式括号匹配(JAVA语言)
思路:刚开始想用stack,遇到'('就push,遇到')'就pop,后来发现其实我们只需要用到栈里'('的个数,所以我们用一个变量统计'('的个数就好啦~ 题目描述 假设一个表达式有英文字母(小写) ...
- 带括号的四则混合运算的算符优先算法-----java实现
1:主方法 package com.baidu; import java.text.NumberFormat;import java.util.ArrayList;import java.util.S ...
- 没有花括号(大括号)的for循环也能正确执行
代码一 for循环没有{}大括号(花括号),在for语句下面是一条语句. for(var i=0;i<3;i++) console.log(1,i); 上面的代码能无误输出: 1 01 11 2 ...
随机推荐
- layoutSubviews在以下情况下会被调用
1.init初始化不会触发layoutSubviews2.addSubview会触发layoutSubviews3.设置view的Frame会触发layoutSubviews,当然前提是frame的值 ...
- linux双机热备份
使用HeartBeat实现高可用HA的配置过程详解 一.写在前面 HA即(high available)高可用,又被叫做双机热备,用于关键性业务.简单理解就是,有2台机器 A 和 B,正常是 A 提供 ...
- C#:获取控件对象在工具箱里的图标
工作上的需要.要写一个对控件操作的插件. 在插件中需要把设计器界面上的控件以树形结构列出来,配上控件在工具箱的图标.效果如图: 怎么能够获取到这个图标呢?下面用个例子说明. public Class ...
- 19 个让 MySQL 效率提高 3 倍的 SQL 优化技巧
优化成本: 硬件>系统配置>数据库表结构>SQL及索引 优化效果: 硬件<系统配置<数据库表结构<SQL及索引 本文我们就来谈谈 MySQL 中常用的 SQL 优化 ...
- leetcode907 Sum of Subarray Minimums
思路: 对于每个数字A[i],使用单调栈找到A[i]作为最小值的所有区间数量,相乘并累加结果.时间复杂度O(n). 实现: class Solution { public: int sumSubarr ...
- 学习UML图和时序图,以及IDEA种查看类之间关系
1.类之间的关系:(6种) 关系 表示 图示 解释 表明的结构和语义 泛化关系 带空心箭头的直线 A继承自B(B指代非抽象类) 继承结构 实现关系 带空心箭头的虚线 小汽车继承车(B指代抽象类) 继承 ...
- JS中删除数组中的元素方法
删除指定下标数组元素 Array.prototype.del=function(index){ if(isNaN(index)||index>=this.length){ return fals ...
- vue操作数组时遇到的坑
用vue操作数组时,一般就那几个方法,而且是可以渲染的,但是有时候列表是渲染不了的先说下操作数组的几个方法吧 1 push ( ) 这个方法是在数组的最后面添加元素 用法: 括号里写需要加入的元素 ...
- react新特性hook
一.hook示例. import React, { useState } from 'react'; function Example() { // 声明一个叫 “count” 的 state 变 ...
- 修改profile导致bash不能用的补救方法
输入这条命令:export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/bin 由于shell命令基本都在/usr/bin,/usr/sbin,/bin ...