1. 程式人生 > >22. Generate Parentheses——回溯法初探

22. Generate Parentheses——回溯法初探

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

For example, given n = 3, a solution set is:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]

完全想不到,在看了別人的演算法後,自己畫圖加以理解才明白,主要是利用兩個條件去限制迭代,把不合格的排除掉,第一個open < max的條件篩選掉的用感嘆號表示,第二個條件close < open

篩選掉的用X表示。max=3時迭代流程如圖:流程圖展示的便是回朔法的求解情況,根據題目,求取確切的解空間樹通過不斷迭代進行求取,在遇到不符合情況的時候中斷該操作並返回上一層。要注意的是,回朔法可能因為沒有遍歷整個解空間樹從而導致求解不完善,不過其依然屬於暴力搜尋的一種,從圖中可見其搜尋範圍呈指數級增長。
迭代流程圖

程式碼如下:

class Solution {
    public List<String> generateParenthesis(int n) {
        List<String> res = new ArrayList<>();
        StringBuilder sb = new StringBuilder();
        helper(res, sb, 0
, 0, n); return res; } public void helper(List<String> res, StringBuilder sb, int open, int close, int max){ if(open == max && close == max){ res.add(sb.toString()); return; } if(open < max){ sb.append("("); helper(res, sb, open
+1, close, max); sb.setLength(sb.length()-1); } if(close < open){ sb.append(")"); helper(res, sb, open, close+1, max); sb.setLength(sb.length()-1); } } }