求n對括號的合法組合

2022-08-05 00:27:18 字數 495 閱讀 1983

一道經典的面試題,求n對括號有多少種合法的組合。

抽象為2n個位置,每個位置可以有2種取值,總共有2^2n個組合,附加約束條件是要符合括號的語法,用來剪枝。

括號語法的合法性條件:初始化左括號和右括號的剩餘數量為n,在給2n個位置賦值的過程中,需要保持剩餘的'('小於等於剩餘的')'

遍歷的過程中,每個位置先嘗試左括號,再嘗試右括號 。

//l表示剩餘的左括號數量,r表示剩餘的右括號數量,第三個引數記錄合法的括號組合數

void findparens(int l, int r, int& validcnt)

//剩餘的左括號大於了右括號,非法case

if(l ==0 )

findparens(l-1,r,validcnt); //

將當前位置賦值為左括號

findparens(l, r-1,validcnt);//

將當前位置賦值為右括號

}void testgenerateparens()

N對括號的合法組合

遞迴實現,需要注意以下幾點 1.遞迴終止條件 2.遞迴遞推關係式 這裡實際上是乙個排列問題,只是排列需要滿足條件在每一次遞迴呼叫時左括號數不能少於右括號數。還有一點需要特別注意,當推出遞迴呼叫時相應的變數要替換掉舊的值,相當於乙個出棧的過程。include define n 20 char outp...

生成n對括號的所有合法排列

例項 n 3,所有的合法序列 左括號的個數 右括號的個數left個左括號和right個右括號 如果right 0 並且 right left 列印右括號 vector generateparenthesis int n void generate int leftnum,int rightnum,s...

n對括號的排列組合

列印n對括號的排列組合。遞迴思想,左括號數量小於n的時候則可以繼續插入左括號,右括號數量小於n且小於左括號數量時為了滿足左右括號相等則插入右括號,終止條件 當string的長度為2n的時候停止並push到vector裡面。注意條件 vector必須用引用,否則每次遞迴都會建立新拷貝。string需要...