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:

[
  "((()))",
  "(()())",
  "(())()",
  "()(())",
  "()()()"
]
題目大意:給定一個整數n,求出n對括號所有合理的組合形式。例如,給定n=3,則所有合理的組成形式為上述5種。解題思路:遞迴,每次傳遞的引數為:括號數n,當前已有的左括號數left,當前已有的右括號數right,當前的括號組成字串s。引數初始分別為:n,0,0,""。
                  遞迴函式每次先判斷是否已經得到滿足條件的組合形式,即left+right==n,如果滿足,新增進結果集合res,並return。否則繼續進行判斷,如果left<n,則可以新增一個左括號,在left<n的情況下,如果right<left,則可以新增一個右括號。如果left=n(不可能>n),那麼只能新增一個右括號。解題程式碼:(3ms,beats 48.34%)
class Solution {
    List<String> res = null;

	public void generate(int n, int left, int right, String s) {
		if (left + right == 2 * n) {
			res.add(s);
			return;
		}
		if (left < n) {
			generate(n, left + 1, right, s + "(");
			if (right < left) {
				generate(n, left, right + 1, s + ")");
			}
		} else {
			generate(n, left, right + 1, s + ")");
		}
	}

	public List<String> generateParenthesis(int n) {
		res = new ArrayList<>();
		generate(n, 0, 0, "");
		return res;
	}
}