22.括號生成

1.題目

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

例如,給出 n = 3,生成結果爲:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]

2.解題

這道題乍一看和全排列差不多,都是固定好全部的數據修改順序,不過那樣做的話需要判斷所有生成的字符串是否符合要求,感覺並不是很輕鬆,這應該算是笨方法吧。

如果要是往上加字符就輕鬆很多了,因爲有些情況不符合要求就直接被pass了。加字符就和全部子串一樣了。basecase要注意一下,會有些複雜。
  思路出來了,但是這是遞歸的,能不能換成動態規劃呢?答案是:我不知道~
  我仔細想了一下,二位數組的話,string沒有辦法換成int的那種索引,惟一的辦法就是用hash來代替一個維度的數組,不過我的STL還沒6到那種地步,而且這樣也過了,就先這樣吧。

3.代碼

leetcode已證

稍微說一下,n是傳入的,目前有多少組括號。xxx是全部到字符串集合我就沒像以前一樣用傳入實參的方式,感覺那樣看起來就過於複雜了,而且算法題也沒必要那樣。
  傳入到三個參數分別代表:左括號的個數,右括號的個數和目前生成的字符串。當然,left+right=x.length(),所以可以減少一個參數,但是我沒有那麼做,感覺那樣寫沒必要。

class Solution {
public:
vector<string>xxx;
int n=0;
void ll(int left, int right, string x)
{
	if (left > n || right > n || left < right)
		return;

	int len = x.length();
	if ((n<<1) == len)
	{
		if (left == right)
		{
			xxx.push_back(x);
			return;
		}
		else
			return;
	}

	ll(left+1,right,x+'(');
	ll(left,right+1,x+')');
}
vector<string> generateParenthesis(int x) {
	n = x;
	ll(1,0,"(");
	return xxx;
}
};
發佈了39 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章