n對括號有多少種合法的組合,比如兩對括號可以有兩種:()()和(())
問題等價為:在乙個字串中包含兩種字元:'('和')',他們出現的次數都為n,並且任何時候'('出現的次數總是大於或等於')'出現的次數。
解決方案:(遞迴)
n表示括號對數,l表示已有括號個數,r表示已有右括號個數
若r = n,則輸出結果
若l < r,不可能
若l = r,則加上左括號
若l > r,分類討論,若l = n,則全部補充右括號;若l < n,可加左括號或加右括號
1 #include2 #include3 #include4using
namespace
std;56
intn;78
void general(int n,int l,int r,int& num,string
res)916
if (l ==r)
1722
else
2336
else
3742}43
return;44
}4546int
main()
4756
return0;
57 }
N對括號的合法組合
遞迴實現,需要注意以下幾點 1.遞迴終止條件 2.遞迴遞推關係式 這裡實際上是乙個排列問題,只是排列需要滿足條件在每一次遞迴呼叫時左括號數不能少於右括號數。還有一點需要特別注意,當推出遞迴呼叫時相應的變數要替換掉舊的值,相當於乙個出棧的過程。include define n 20 char outp...
n對括號的排列組合
列印n對括號的排列組合。遞迴思想,左括號數量小於n的時候則可以繼續插入左括號,右括號數量小於n且小於左括號數量時為了滿足左右括號相等則插入右括號,終止條件 當string的長度為2n的時候停止並push到vector裡面。注意條件 vector必須用引用,否則每次遞迴都會建立新拷貝。string需要...
求n對括號的合法組合
一道經典的面試題,求n對括號有多少種合法的組合。抽象為2n個位置,每個位置可以有2種取值,總共有2 2n個組合,附加約束條件是要符合括號的語法,用來剪枝。括號語法的合法性條件 初始化左括號和右括號的剩餘數量為n,在給2n個位置賦值的過程中,需要保持剩餘的 小於等於剩餘的 遍歷的過程中,每個位置先嘗試...