一、问题导出

今天在做算法题目的时候遇到了一道左右括号匹配的问题,问题如下:

二、问题思考

(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实现的更多相关文章

  1. 9.9递归和动态规划(六)——打印n对括号的所有有效组合(即左右括号正确配对)

    /**  * 功能:打印n对括号的所有有效组合(即左右括号正确配对). */ 两种方法: 方法一: /** * 思路:在括号的最前面或者原有的每对括号中面插入一对括号. 至于其它任何位置.比方字符串的 ...

  2. 面试编程题拾遗(06) --- 打印n对括号的全部有效组合

    如题所述,当n=3时,可能的组合有:(()()), ((())), ()(()), (())(), ()()() 代码如下(有注释): import java.util.ArrayList; impo ...

  3. [LeetCode]678. 有效的括号字符串、20. 有效的括号(栈)

    题目 678. 有效的括号字符串 给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串.有效字符串具有如下规则: 任何左括号 ( 必须有相应的右括号 ). 任何 ...

  4. 百度2014校园招聘算法——给出一组数据A=[a_0, a_1, a-2, ... a_n](当中n可变),打印出该数值元素的全部组合。

    VC++ void StringTest(CString source, CStringArray& dest) { if(source.IsEmpty()) { } else { CStri ...

  5. Anton and School - 2 CodeForces - 785D (组合计数,括号匹配)

    大意: 给定括号字符串, 求多少个子序列是RSGS. RSGS定义如下: It is not empty (that is n ≠ 0). The length of the sequence is ...

  6. 打印N个真值的所有真值组合

    例:N=2 (true,true),(false,true),(true,false),(false,false) #include<stdio.h> int count=0; void ...

  7. P1739_表达式括号匹配(JAVA语言)

    思路:刚开始想用stack,遇到'('就push,遇到')'就pop,后来发现其实我们只需要用到栈里'('的个数,所以我们用一个变量统计'('的个数就好啦~ 题目描述 假设一个表达式有英文字母(小写) ...

  8. 带括号的四则混合运算的算符优先算法-----java实现

    1:主方法 package com.baidu; import java.text.NumberFormat;import java.util.ArrayList;import java.util.S ...

  9. 没有花括号(大括号)的for循环也能正确执行

    代码一 for循环没有{}大括号(花括号),在for语句下面是一条语句. for(var i=0;i<3;i++) console.log(1,i); 上面的代码能无误输出: 1 01 11 2 ...

随机推荐

  1. [Scikit-learn] *2.3 Clustering - MeanShift

    sklearn.cluster.MeanShift Ref: http://scikit-learn.org/stable/auto_examples/cluster/plot_mean_shift. ...

  2. PAT 甲级 1024 Palindromic Number (25 分)(大数加法,考虑这个数一开始是不是回文串)

    1024 Palindromic Number (25 分)   A number that will be the same when it is written forwards or backw ...

  3. 微信小程序文字超过行后隐藏并且显示省略号

    在小程序开发过程中,经常会遇到一些数据无法在text中完全展示,所以会使用到隐藏相关文字,并在后方加上省略号(...). 只需要在对应的text中设置下面的css就可以了. overflow:hidd ...

  4. ivy使用Maven阿里云镜像的问题

    ivy默认使用的Maven仓库下载速度有点慢,所以想改成国内的,添加如下resolver: <ibiblio name="working-chinese-mirror" ro ...

  5. Adobe Acrobat 如何通过书签制作多级目录

    废话不多说,直接上官方文档 看不清可 右击 > 在新标签页中打开图片

  6. NOIP 2015:信息传递

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...

  7. ActiveMQ单机部署及简单应用

    系统版本:Centos 7 前言 MQ是消息中间件,是一种在分布式系统中应用程序借以传递消息的媒介,常用的有ActiveMQ,RabbitMQ,kafka.ActiveMQ是Apache下的开源项目, ...

  8. hdoj4276(树形dp+分组背包)

    题目链接:https://vjudge.net/problem/HDU-4276 题意:给出一棵树,起点为1,时间为V,终点为n,每个点有一个价值a[u],每条边有一个时间花费w,求在时间V内到达终点 ...

  9. 数据库学习其一 oracle11g数据泵导入导出

    一.检查环境一致性 需检查数据库客户端与服务端字符编码,以避免后续各种各样的问题 查询服务端编码 注意最好用sqlplus查询,用plsql有时候会出现查询不一致问题,如下图同一个语句在plsql和s ...

  10. java 分解整数 【个 十 百 千】,获得个位、十位、百位数字

    求一个数数的个位数,十位数,百位数及千位: int num = 53; int g = (num / 1) % 10;  //个位 int s = (num / 10) % 10; //十位 int ...