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的不重複陣列,求所有可能的入棧出棧順序。該問題解的個數也是卡特蘭數,根據上面的思路,我們也可以寫出一個類似的程式碼:
上述程式碼由於採用了棧和佇列模仿整個過程,所以顯得略微複雜,但是程式碼的基本結構還是符合一個類似的基本規則:在某一個特定時刻,入棧的次數大於或者等於出棧的次數。在生成括號的問題中,我們利用一個string來儲存結果,由於列印左括號時不影響列印右括號,所以無需複雜的狀態恢復。在入棧出棧順序問題中,由於兩次遞迴呼叫共享同一個棧和佇列,所以我們需要手動恢復其內容。在恢復時,佇列會從頭部刪除和新增,所以我們採用了deque,它可以在頭部新增和刪除元素。queue只能在頭部刪除元素,所以沒有采用。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(); } }
相關推薦
leetcode之Generate 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還是
leetcode之Valid 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(括號)。 思路一:最樸素的方法就是
【LeetCode】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
[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