1. 程式人生 > >leetcode之 Generate Parentheses

leetcode之 Generate Parentheses

描述:給定一個非負整數n,生成n對括號的所有合法排列。

解答:

該問題解的個數就是卡特蘭數,但是現在不是求個數,而是要將所有合法的括號排列打印出來。

       該問題和《程式設計之美》的買票找零問題一樣,通過買票找零問題我們可以知道,針對一個長度為2n的合法排列,第1到2n個位置都滿足如下規則:左括號的個數大於等於右括號的個數。所以,我們就可以按照這個規則去列印括號:假設在位置k我們還剩餘left個左括號和right個右括號,如果left>0,則我們可以直接列印左括號,而不違背規則。能否列印右括號,我們還必須驗證left和right的值是否滿足規則,如果left>=right,則我們不能列印右括號,因為列印會違背合法排列的規則,否則可以列印右括號。如果left和right均為零,則說明我們已經完成一個合法排列,可以將其打印出來。通過深搜,我們可以很快地解決問題,針對n=2,問題的解空間如下:


按照這種思路,程式碼如下:

void generate(int leftNum,int rightNum,string s,vector<string> &result)
    {
        if(leftNum==0&&rightNum==0)
        {
            result.push_back(s);
        }
        if(leftNum>0)
        {
            generate(leftNum-1,rightNum,s+'(',result);
        }
        if(rightNum>0&&leftNum<rightNum)
        {
            generate(leftNum,rightNum-1,s+')',result);
        }
}

網上對該問題的解答非常多,無一例外都採用了遞迴,但是鮮見和上面思路如此清晰的演算法。上述演算法的思路是很多問題的通解,值得仔細研究。

作為一個例子,看一下陣列的入棧出棧順序問題:給定一個長度為n的不重複陣列,求所有可能的入棧出棧順序。該問題解的個數也是卡特蘭數,根據上面的思路,我們也可以寫出一個類似的程式碼:

void inoutstack(int in,int out,deque<int> &q,stack<int> &s,deque<int> seq,vector<deque<int>> &result)
	{
		if(!in&&!out)
		{
			result.push_back(q);
			return;
		}

		if(in>0)
		{
			s.push(seq.front());
			seq.pop_front();
			inoutstack(in-1,out,q,s,seq,result);
			seq.push_front(s.top());
			s.pop();
		}

		if(out>0&&in<out)
		{
			q.push_back(s.top());
			s.pop();
			inoutstack(in,out-1,q,s,seq,result);
			s.push(q.back());
			q.pop_back();
		}
	}
上述程式碼由於採用了棧和佇列模仿整個過程,所以顯得略微複雜,但是程式碼的基本結構還是符合一個類似的基本規則:在某一個特定時刻,入棧的次數大於或者等於出棧的次數。在生成括號的問題中,我們利用一個string來儲存結果,由於列印左括號時不影響列印右括號,所以無需複雜的狀態恢復。在入棧出棧順序問題中,由於兩次遞迴呼叫共享同一個棧和佇列,所以我們需要手動恢復其內容。在恢復時,佇列會從頭部刪除和新增,所以我們採用了deque,它可以在頭部新增和刪除元素。queue只能在頭部刪除元素,所以沒有采用。

相關推薦

leetcodeGenerate Parentheses

題目: Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, given n&nb

leetcode Generate Parentheses

描述:給定一個非負整數n,生成n對括號的所有合法排列。 解答: 該問題解的個數就是卡特蘭數,但是現在不是求個數,而是要將所有合法的括號排列打印出來。        該問題和《程式設計之美》的買票找零問題一樣,通過買票找零問題我們可以知道,針對一個長度為2n的合法排列,第1

[LeetCode] 22. Generate Parentheses 生成括號

long array and code air sisd www str ons Given n pairs of parentheses, write a function to generate all combinations of well-formed paren

leetcode 22-Generate Parentheses(medium)

The new add col turn leet edi left array backtracking class Solution { public List<String> generateParenthesis(int n) {

leetcode#22. Generate Parentheses

rate gin != lee nth 可能 tco leetcode generate 給出 n 代表生成括號的對數,請你寫出一個函數,使其能夠生成所有可能的並且有效的括號組合。 例如,給出 n = 3,生成結果為: [ "((()))", "(()())", "(())

LeetCode 22. Generate Parentheses

需要 ret 16px pub valid bin amp 流程 des Given n pairs of parentheses, write a function to generate all combinations of well-formed paren

LeetCode Day20 Generate Parentheses

法一:遞迴DFS 列出所有結果,考慮遞迴。由於字串只有左括號和右括號兩種字元,而且最終結果必定是左括號n個,右括號n個,所以我們定義兩個變數left和right分別表示剩餘左右括號的個數,如果在某次遞迴時,左括號的個數大於右括號的個數,說明此時生成的字串中右括號的個數大於左括號的個數,直接返

[leetcode]22. Generate Parentheses

Solution 1: 遞歸回溯法 回溯就是找到所有的解,一直沒用java寫過回溯,突然有點懵逼 一直往左下走 if (open < max) backtrack(ans, cur+"(", open+1, close, max); cur還是

leetcodeValid Parentheses

題目: Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid. An input stri

[leetcode] 22. Generate Parentheses(medium)

原題 思路: 利用DFS,搜尋每一種情況,同時先加“(”後加")",保證()匹配正確。 最近開始學習前端,嘗試用js來寫。 const generate = function (res,content,

leetcode-22.Generate Parentheses 括號生成

題目: Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, give

LeetCode--22. Generate Parentheses

題目連結:https://leetcode.com/problems/generate-parentheses/submissions/ 要求生成n組合法的括號序列,也就是2n個字元,每個字元取自'('或')',且這個字元序列是合法的Parenthesis(括號)。 思路一:最樸素的方法就是

LeetCodeGenerate Parentheses 解題報告

【題目】 Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, given n = 3, a

LeetCode 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

[LeetCode]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

leetCode 22.Generate Parentheses (生成括號) 解題思路和方法

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

LeetCode-22-Generate Parentheses

ati 數字 str 描述 function nth oid 數量 med 算法描述: Given n pairs of parentheses, write a function to generate all combinations of well-formed pa

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

題目描述:    Given n pairs of parentheses, write a function to generate all combinations of well-formed p

(Java)LeetCode-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 so

[leetcode] 22. Generate Parentheses

Givenn pairs of parentheses, write a function to generate all combinations of well-formed parenthe