輸出n對括號的所有有效排列組合
問題:
輸出n對括號所有有效的排列組合。比如三對括號,其有效的排列組合方式總共有5種:()()(),((())),(())(),()(()),(()())。解決思路:
將一對括號編碼為01,即左括號為0,右括號為1,那麼n對括號的所有排列組合(不一定有效)就是n個0和n個1的全排列,全排列演算法相對容易實現。假如我們已經得到了所有的全排列,那麼接下來就是排除全排列中排列無效的形式。排除的方式也簡單:從頭遍歷,遇到01挨著的就刪除掉,直到整個字串為空(有效),或不存在01組合(無效)。程式碼:
全排列
注:使用生成器是為了方便記錄排列結果, 另:此時得到的全排列有重複的,可通過set來去重({}.fromkeys(lst).keys())def permutation(lst,beg): if beg>=len(lst): yield "".join([str(x) for x in lst]) return for index in range(beg,len(lst)): lst[index],lst[beg]=lst[beg],lst[index] for val in permutation(lst,beg+1): yield val lst[index],lst[beg]=lst[beg],lst[index]
排列有效性檢查
def chkstr(args): if len(args)==0: return True tmp=list(args) index=1 while index < len(tmp): pre=tmp[index-1] pst=tmp[index] if pre=='0' and pst=='1': tmp[index-1]='-1' tmp[index]='-1' index=index+2 else: index=index+1 args="".join(tmp) if args.count('-1')==0: return False else: return chkstr(args.replace('-1', ''))
最後:
if __name__ == '__main__':
lst=[]
for val in permutation([0,0,0,1,1,1],0):
t=chkstr(val)
if t:
lst.append(val)
rst={}.fromkeys(lst).keys()
for val in rst:
print val
def brackets(left, right, bks): if left > right: return if right == 0: yield bks if 0 < left <= right: for val in brackets(left-1, right, bks+"("): yield val if right > max(left, 0): for val in brackets(left, right-1, bks+")"): yield val
相關推薦
輸出n對括號所有有效的匹配 java實現
原題 為 :Print all combinations of balanced parentheses input: 3 (e.g., 3 pairs of parentheses)outpu
輸出n對括號的所有有效排列組合
問題: 輸出n對括號所有有效的排列組合。比如三對括號,其有效的排列組合方式總共有5種:()()(),((())),(())(),()(()),(()())。 解決思路: 將一對括號編碼為01,即左括號為0,右括號為1,那麼n對括號的所有排列組合(不一定有效)就是n個0和n
n對括號問題,(求n對括號的正確排列有多少)
import java.util.ArrayList; import java.util.List; import java.ut
9.9遞歸和動態規劃(六)——打印n對括號的所有有效組合(即左右括號正確配對)
思路 即使 情況 else 字符 ram 配對 字符串 pop /** * 功能:打印n對括號的所有有效組合(即左右括號正確配對)。 */ 兩種方法: 方法一: /** * 思路:在括號的最前面或者原有的每對括號中面插入一對括號。至於其它
輸出n對圓擴號的所有有效組合
前言: n年前,面試某大廠時,面試官要求手寫該演算法,當時記得只說出了想用遞迴去做,但具體實現上由於緊張等原因吧,思路不夠清晰,沒有描述清楚,當時的面試也是掛掉了,後來也想過,但是沒整理出來,直到最近看到leetcode上有道題(https://leetcode.com/problems/gen
面試程式設計題拾遺(06) --- 列印n對括號的全部有效組合
如題所述,當n=3時,可能的組合有:(()()), ((())), ()(()), (())(), ()()() 程式碼如下(有註釋): import java.util.ArrayList; im
給定n對括號,編寫一個函式來生成正確括號的所有組合。
本題源自leetcode ----------------------------------------------------------------------------------------------- 思路: 1 用回溯法。用變數m 表示左括號的數量。n
9.9遞迴和動態規劃(六)——列印n對括號的全部有效組合(即左右括號正確配對)
/** * 功能:列印n對括號的全部有效組合(即左右括號正確配對)。 */ 兩種方法: 方法一: /** * 思路:在括號的最前面或者原有的每對括號裡面插入一對括號。至於其他任意位置,比如字
列印n對括號的全部有效組合
這道題最基本的思路是求出n對括號的全排列,然後對每種排列方式判定是否有效。判定方法如下: bool IsMatch(string& str) { if(str.size() % 2 != 0
22.Generate Parentheses&n對括號的全部有效組合
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, given n = 3, a so
n對括號可以有多少種匹配排列方式(演算法面試題)
問題:n對括號可以有多少種匹配排列方式?比如兩對括號可以有兩種:()()和(()) 思路:問題可轉化為:在一個string中包含兩個字元:'('和')',他們出現的次數都為n,並且任何時候'('出現的次數總是>=')'出現的次數。 解決方案(遞迴): 標誌:l: 左括
括號所有有效組合
實現一種演算法,列印n對括號的全部有效組合(左右括號正確配對) 核心思想: 1.左括號:只要左括號還沒用完,就可以插入括號。 2.右括號:只要不造成語法錯誤,就可以插入右括
小米麵試題:N對括號的所有合法狀態
給定N對括號,輸出其所有的合法的組合狀態,例如,N=3,所有的合法狀態為:"((()))”, “(()())”, “(())()”, “()(())”, “()()()” 思路:還是深搜DFS的思路,深搜的過程關鍵在於記錄已經用掉的左括號個數和右括號的個數,當用過的左
給定一個字串,輸出所有的排列組合方式
去參加一個筆試,遇到一個問題就是給定字串"123456"要我寫程式輸出所有的排列組合方式,當時頭很大,一直想不出來,於是很磋的寫了迴圈。回來了好好想了想,參考網上的資料,今天真正理解並且自己寫了出來。是用遞迴,理解為每次都是求已知的字串與未排列的字串的組合! /* 201
n對括號的匹配方式(卡特蘭數)
4對括號有多少種可能的合法匹配方式?n對括號呢? 此題是卡特蘭數的一個通常應用,相似的還有出棧順序等。關於卡特蘭數的具體內容,請參閱百度百科或Wiki. http://baike.baidu.com/view/2499752.htm 網路上可以搜到很多相關的題目和解答
輸出n以內的所有質數
1.基本方法:對於n以內的每個數,一直除到sqrt(n),仍遇不到能整除的,則是質數: void printPrime(int n){if (n < 2)return;for (int i = 2; i <= n; i++){int j = 2;for (; j
基礎編程復習:輸出n以內的所有素數
滿足 scanf col ostream 素數 clas %d eof 只需要 暴力遍歷:對於1~n以內的每一數i 每一個i只需要考慮2~i開根號以內是否有可以讓i整除的數,即(i%x==0)只要滿足就不是素數 否則輸出 1 #include<iostre
《已測試通過》輸入兩個整數 n 和 m,從數列1,2,3.......n 中隨意取幾個數,使其和等於m ,要求將其中所有的可能組合列出來,並且按每個組合的字典序排列輸出,每行輸出一種組合
參考網上很多,瑪德都不測試的嗎?就貼出來了?浪費時間。網際網路精神在哪!!! import java.util.ArrayList; import java.util.Comparator; import java.util.LinkedList; import java.util.Scanne
輸出N個數中取M個數的所有組合,排列情況
一般思路是由組合算排列,現在藉助Next_permutation函式由排列到組合。 1.組合 讀入一個字串,一個整數n,輸出字串中取n個字元的所有組合情況 演算法:藉助Next_permutation函式,構造一個大小為len=str.length()的陣列,0表示要輸出
n個括號對的所有可能情況
括號 main color 思路 出棧 gin col r+ div 所有可能情況的數量為卡特蘭數。故求所有可能的出棧情況與此類似。 思路: 若左括號沒全插入,則插入左括號; 若已插入左括號數比已插入右括號數多,則插入右括號; 1 #include<st