1. 程式人生 > >LeetCode 22. Generate Parentheses(生成合法圓括號序列)

LeetCode 22. Generate Parentheses(生成合法圓括號序列)

題目描述:

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

例子(n=3):

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

分析:
    題意:給定數字n,需要返回n對圓括號組成的所有合法序列的集合。
    思路:由於需要返回所有結果,因此我們採用DFS搜尋。我們用left和right表示已經使用的左括號、右括號的數量,判斷條件如下:①如果left小於right,不符合、停止搜尋;②如果left大於right,此時可以加入左括號或者右括號、繼續搜尋;③

如果left等於right,此時可以加入左括號、繼續搜尋;④如果left和right某一個大於n,不符合、停止搜尋;⑤如果left和right同時等於n,說明找到一組解,加入答案、繼續搜尋。

程式碼:

#include <bits/stdc++.h>

using namespace std;

class Solution {
private: 
	vector<string> ans;
	
	void DFS(int n, int left, int right, string res){
		// debug
		// cout << "left: " << left << ", right: " << right << endl;
		// Exceptional Case: 
		if(left == n && right == n){
			ans.push_back(res);
			return;
		}
		if(left > n || right > n){
			return;
		}
		if(left < right){
			return;
		}
		DFS(n, left + 1, right, res + "(");
		if(left > right){
			DFS(n, left, right + 1, res + ")");
		}
	}

public:
    vector<string> generateParenthesis(int n) {
        // Exceptional Case: 
		if(n <= 0){
			return vector<string>();
		}
		ans.clear();
		DFS(n, 0, 0, "");
		return ans;
    }
};