1. 程式人生 > >輸出n對括號的所有有效排列組合

輸出n對括號的所有有效排列組合

問題:

輸出n對括號所有有效的排列組合。比如三對括號,其有效的排列組合方式總共有5種:()()(),((())),(())(),()(()),(()())。

解決思路:

將一對括號編碼為01,即左括號為0,右括號為1,那麼n對括號的所有排列組合(不一定有效)就是n個0和n個1的全排列,全排列演算法相對容易實現。假如我們已經得到了所有的全排列,那麼接下來就是排除全排列中排列無效的形式。排除的方式也簡單:從頭遍歷,遇到01挨著的就刪除掉,直到整個字串為空(有效),或不存在01組合(無效)。

程式碼:

全排列

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]
注:使用生成器是為了方便記錄排列結果, 另:此時得到的全排列有重複的,可通過set來去重({}.fromkeys(lst).keys())

排列有效性檢查

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