1. 程式人生 > >leetcode 括號生成

leetcode 括號生成

題目描述:

給出 n 代表生成括號的對數,請你寫出一個函式,使其能夠生成所有可能的並且有效的括號組合。

例如,給出 = 3,生成結果為:

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

 解題思路:

回溯法。搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就“回溯”返回,嘗試別的路徑。括號生成規律:

1)右括號等於n,即對數時,即找到一對;

2)左括號小於n,可以新增左括號;

3)左括號大於右括號個數時,新增右括號。

符合上述規律生成的樹如下:

C++程式碼:

class Solution {
public:
	vector<string> generateParenthesis(int n) {
		vector<string> res;
		helper("",res,n,0,0);
		return res;
	}
	/*回溯法解決該問題
	回溯演算法實際上一個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就“回溯”返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為“回溯點”。許多複雜的,規模較大的問題都可以使用回溯法,有“通用解題方法”的美稱。”
	*/
	void helper(string cur, vector<string> &res, int n, int left, int right)
	{
		//因為right是右括號,數量=n 表明此時已經找到一個結果
		if (right == n)
		{
			res.push_back(cur);
		}
		//可以新增一個左括號
		if (left < n)
		{
			helper(cur+'(',res,n,left+1,right);
		}
		//新增一個右括號
		if (right < left)
		{
			helper(cur+')',res,n,left,right+1);
		}
	}
	 
};