逐步生成结果之非数值型

1.问题描述:

输出合法的括号组合
输入括号对数
输出所有合法组合
输入:3
输出: ( ) ( ) ( ) ,( ( ( ) ) ) , ( ( ) ( ) ), ( ) ( ( ) ), ( ( ) ) ( )

2.首先要理解题目表达的意思,理解清楚之后可能一开始没有什么思路,但是我们要养成一种解题的习惯,那就是遇到复杂的问题先从简单的问题入手,从一开始写出几个简单的例子帮助我们分析,写出几个例子之后看一下能不能发现什么规律看看能不能从简单的例子推出一般进而找到解题的思路

像这个题目一样我们可以写出一对括号,两对括号 ,三对括号进行分析

一对括号只有一种合法的解:( )

两对括号我们可以在第一对括号的基础上进行扩展,可以往( )的左边添加括号:( ) ( ) 可以往( )的右边添加括号( ) ( )

也可以在( )的外边添加括号因为只有上面这三种情况是合法的( ( ) )

进一步可以写出第四对和第五对的括号发现规律也是上一层括号的基础上去添加左边括号,右边括号,外边括号

...

我们可以发现每一对括号都是上一层的基础上去添加左括号 右括号 外边的括号这也就是递归的思想了,所以通过上面的分析可以发现我们是可以使用递归来解决问题的

其中使用到了一种数据结构来保存当前层的括号,因为添加括号的时候有可能重复,所以可以使用了Set数据结构来去除集合中重复的元素

3. 代码如下:

import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class Main{
    //set数据结构有助于去重当添加的元素有重复的时候可以去掉
    //使用递归的话可以很方便地进行解决
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        Set<String> set = solve(n);
        for(String setStr:set){
            System.out.println(setStr);
        }
    }

    private static Set<String> solve(int n){
        Set<String> str = new HashSet<String>();
        if(n == 1){
            str.add("()");
            return str;
        }
        Set<String> setStr = solve(n - 1);
        //递归调用解释之后会返回到上一层进行层层的更新添加括号
        for(String set:setStr){
            str.add(set + "()");
            str.add("()" + set);
            str.add("(" + set + ")");
        }
        return str;
    }
}
 

我们除了可以使用递归的方法还可以使用迭代的方法来进行求解

代码如下:

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 = solve(n);
        for(String setStr : set){
            System.out.println(setStr);
        }
    }

    private static Set<String> solve(int n) {
        Set<String> set = new HashSet<>();
        set.add("()");
        if(n == 1) return set;
        for(int i = 1; i < n; i++){
            Set<String> helpSet = new HashSet<>();
            for(String setStr : set){
                helpSet.add("()" + setStr);
                helpSet.add(setStr+"()");
                helpSet.add("(" + setStr + ")");
            }
            set = helpSet ;
        }
        return set;
    }
}
 

猜你喜欢

转载自blog.csdn.net/qq_39445165/article/details/83063392