1. 程式人生 > >逐步生成結果之非數值型

逐步生成結果之非數值型

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;
    }
}