1. 程式人生 > >第十六週演算法分析與設計:Generate Parentheses

第十六週演算法分析與設計: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 is:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]

Subscribe to see which companies asked this question.

問題出自此處

解法思路:
這是一道關於backtracking的問題,題意是求n對括號的全排列,但要求排列要合法。
可以這樣考慮:
停止條件:當字串的長度為2n,即n對括號的時候,回溯停止並把得到的字串加進vector中。
狀態轉換過程:假設當前得到的字串為cur_str,當它比n小時(表示當前字串還可以容納至少一對”()“),則將cur_str+”(“進入下一個新的狀態;如果cur_str關於上一個”(“的回溯完成後,可以加入對應於這個”(“的右括號即”)”,當然前提是右括號的個數要比左括號的個數要小才能存在對應的。

class Solution {
public:
    int
l_used=0, r_used=0; vector<string> generateParenthesis(int n) { vector<string> result; permutation(result,"",0,0,0,n); return result; } void permutation(vector<string>&result, string cur_str, int l_used, int r_used, int len,int n) { if (len == n * 2
){ result.push_back(cur_str); return; } else{ if (l_used < n){ permutation(result, cur_str+"(", l_used+1, r_used, len+1,n); } if (r_used < l_used){ permutation(result, cur_str+")", l_used, r_used+1, len+1,n); } } } };

時間複雜度為O(N)
還有個注意的問題。就是在進入狀態轉換函式之前不能先將字串修改了!!!否則的話就會進入不了下個狀態,只會得到一個結果。(n=3、4的時候是這樣。。)

相關推薦

演算法分析設計Generate Parentheses

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

演算法分析設計Merge Two Sorted Lists

問題描述: Merge two sorted linked lists and return it as a new list. The new list should be made by s

演算法分析設計 Find Bottom Left Tree Value

問題描述: Given a binary tree, find the leftmost value in the last row of the tree. Example 1:

演算法分析設計Minimum Size Subarray Sum

演算法描述: Given an array of n positive integers and a positive integer s, find the minimal length of

四周演算法分析設計Swap Nodes in Pairs

演算法描述 Given a linked list, swap every two adjacent nodes and return its head. For example,

九周演算法分析設計 Search for a Range

問題描述: Given an array of integers sorted in ascending order, find the starting and ending position

演算法分析設計動態規劃之矩陣鏈乘

矩陣鏈乘問題 對於給定的n個矩陣,M1, M2 ,…, Mn,其中矩陣Mi 和Mj 是可乘的,要求確定計算矩陣連乘積 ( M1M2 …Mn )的計算次序,使得按照該次數計算 矩陣連乘積時需要的乘法次數最少 1、描述最優解結構 目標: 求出矩陣鏈乘Mi Mi+1 ┅Mj-1 Mj(

C/C++ 演算法分析設計貪心(整數配對)

題目描述 江鳥想到一個有趣的問題:給你N個正整數,你可以將這N個整數按兩個一組的方式成對劃分,當然其中的元素也可以不和其他元素配對劃分。現在的問題是,讓劃分為一對的元素的乘積與未配對的元素相加求和,並且讓和最大。比如:考慮這個集合{0,1,2,4,5,3},如果我們讓{0,3}、{2,5}分別成

C/C++ 演算法分析設計貪心(排隊接水)

題目描述 N個人同時提水到一個水龍頭前提水因為大家的水桶大小不一,所以水龍頭注滿第i(i=1,2,3......N)個人所需要的時間是T(i) 編寫一個程式,對這N個人使他們花費的時間總和最小,並求出這個時間。 例如有三個人a,b,c,用時分別是2,1,3 排隊順序為c,b,a的時候,c要等

C/C++ 演算法分析設計貪心(守望者的逃離)

題目描述 惡魔獵手尤迫安野心勃勃.他背叛了暗夜精靈,率深藏在海底的那加企圖叛變:守望者在與尤迪安的交鋒中遭遇了圍殺.被困在一個荒蕪的大島上。為了殺死守望者,尤迪安開始對這個荒島施咒,這座島很快就會沉下去,到那時,刀上的所有人都會遇難:守望者的跑步速度,為17m/s, 以這樣的速度是無法逃離荒島的

C/C++ 演算法分析設計列舉(分數拆分)

題目描述 現在輸入一個正整數k,找到所有的正整數x>=y,使得1/k=1/x+1/y. 輸入 第一行輸入一個整數n,代表有n組測試資料。 接下來n行每行輸入一個正整數k 輸出 按順序輸出對應每行的k找到所有滿足條件1/k=1/x+1/y的組合 樣例輸入 2

C/C++ 演算法分析設計列舉(二倍的問題)

題目描述 給定2到15個不同的正整數,你的任務是計算這些數裡面有多少個數對滿足:數對中一個數是另一個數的兩倍。比如給定1 4 3 2 9 7 18 22,得到的答案是3,因為2是1的兩倍,4是2個兩倍,18是9的兩倍。 輸入 輸入包括n組測試資料。每組資料包括一行,給出

C/C++ 演算法分析設計貪心(搬運工)

題目描述 搬運工的工作非常辛苦,不僅是因為要費體力,而且幹活要有技巧,不能總是用蠻力。假設你是一名搬運工,給定一個最大載重量為M公斤的卡車和N種食品,有食鹽,白糖,大米等。已知第 i 種食品的擁有Wi 公斤,其商品價值為Vi元/公斤,程式設計確定一個裝貨方案,使得裝入卡車中

C/C++ 演算法分析設計貪心(等價交換)

題目描述 黑龍江的五常大米全國聞名,每年到了秋天,農民們把自己家的大米到集市上去買,但由於五常地區還是一個比較落後的地方,還實行物物交換,即農民用大米換白麵,可以用來蒸饅頭啊!每個集市上大米換白麵的比例並不相等,如何能用最少的大米換到最多的白麵呢?(單位是斤) 輸入 輸

C/C++ 演算法分析設計貪心(今年暑假不AC)

題目描述 “今年暑假不AC?” “是的。” “那你幹什麼呢?” “看世界盃呀,笨蛋!” “@#$%^&*%...” 確實如此,世界盃來了,球迷的節日也來了,估計很多ACMer也會拋開電腦,奔向電視了。 作為球迷,一定想看盡量多的完整的比賽,當然,作為新時代的好青年,

C/C++ 演算法分析設計遞迴(放蘋果)

題目描述 把M個同樣的蘋果放在N個同樣的盤子裡,允許有的盤子空著不放,問共有多少種不同的分法?(用K表示)5,1,1和1,5,1 是同一種分法。 輸入 第一行是測試資料的數目t(0 <= t <= 20)。以下每行均包含二個整數M和N,以空格分開。1<

演算法分析設計

分析:每次移除一個數,要儘可能使前面的數最小,因為前面的數的權值最大。而刪除一個數,會導致後面緊接著的一個數代替刪除的數的位置。所以在一次移除操作中,從前往後檢查,一旦發現某個數後繼的數更小,則刪除此數。複雜度為o(k*n),可以採用遞迴的方法實現。(然而遞

演算法分析設計

這裡直接採用手工乘法演算法,兩個迴圈即可解決,複雜度為o(n*m),n,m分別為兩個字串的長度 程式碼: string multiply(string num1, string num2)

演算法分析設計

習題8.3——證明吝嗇SAT問題是NP完全問題 問題描述:給定一組子句(每個子句都是其中文字的析取)和整數k,求一個最多有k個變數為true的滿足賦值——如果該賦值存在。證明吝嗇SAT問題為NP完全問

演算法分析設計】【】139. Word Break

Word Break 題目大意 思路 解題程式碼 時間複雜度 動態規劃基礎訓練。 139. Word Break 題目大意 給定一個字串和一個合法詞的集和(詞典),判斷該字串能否由詞典中的片語成。 例 s= “l