1. 程式人生 > >輸出n對圓擴號的所有有效組合

輸出n對圓擴號的所有有效組合

前言:

n年前,面試某大廠時,面試官要求手寫該演算法,當時記得只說出了想用遞迴去做,但具體實現上由於緊張等原因吧,思路不夠清晰,沒有描述清楚,當時的面試也是掛掉了,後來也想過,但是沒整理出來,直到最近看到leetcode上有道題(https://leetcode.com/problems/generate-parentheses/)與我當時面試的題及其類似,花了一上午的時間整理出來該題,僅供參考(很多思路是參考CSDN上眾大神的,感恩)

正文:

該問題可以使用遞迴去做(還有其他方式,此處不做討論),分析該問題,可以定義三個規則

1:當左括號的數量小於n時,可以繼續列印左括號。

2:當右括號的數量小於左括號且小於n時,可以繼續列印右括號。

3:當字串的長度等於n*2時是需要列印的字串。

程式碼如下

 public static List<String> generateParenthesis(int n) {
        return generateEffectStr(0, 0, "", n);
    }

    public static void main (String[] args){
        List<String> strings = generateParenthesis(3);
        strings.stream().forEach(x->System.out.println(x));
    }
    public static List<String> list = new ArrayList<>();

    public static List<String> generateEffectStr(int left, int right, String str, int num) {
        if (str.length() == num * 2) {
            list.add(str);
            return list;
        }
        if (left < num) {
            generateEffectStr(left + 1, right, str + '(', num);
        }
        if (right < num && left > right) {
            generateEffectStr(left, right + 1, str + ')', num);
        }
        return list;
    }

遞迴流程如下:”

 

另外:關於遞迴的知識可以參考(很好的一篇文章):https://blog.csdn.net/theknotyouknow/article/details/24435291