思路:
括號匹配可以直接用棧匹配,這裡使用遞迴,主要遞迴方式為
首先全部左括號,任何對數括號都會有這種形式
(((
()))
)
由於左括號放在最前面的方式,只有這一種排列,所以需要回退,把第四個左括號先不匹配,那麼左括號就會出現在右括號後面,這時候再遞迴,就會產生幾種新的排列
(((
)())
)(((
))()
)(((
)))(
)
依次這樣進行下去,直到放在最左邊的左括號只有1個,這是最後一種,所有對數都會有這種形式
()(
)()(
)
其實就是模擬乙個棧的回退過程,棧和遞迴是可以互換的
**:(c++)
#include
using
namespace std;
//括號的對數,放在這裡避免遞迴存放太多引數
int size;
/* left:左括號使用個數
right:右括號使用個數
result:拼接的字串
*/void
place
(int left,
int right,string result)
else
//右括號小於左括號數,還可以加
if(right < left)}}
intmain()
結果: N對括號的合法組合
遞迴實現,需要注意以下幾點 1.遞迴終止條件 2.遞迴遞推關係式 這裡實際上是乙個排列問題,只是排列需要滿足條件在每一次遞迴呼叫時左括號數不能少於右括號數。還有一點需要特別注意,當推出遞迴呼叫時相應的變數要替換掉舊的值,相當於乙個出棧的過程。include define n 20 char outp...
求n對括號的合法組合
一道經典的面試題,求n對括號有多少種合法的組合。抽象為2n個位置,每個位置可以有2種取值,總共有2 2n個組合,附加約束條件是要符合括號的語法,用來剪枝。括號語法的合法性條件 初始化左括號和右括號的剩餘數量為n,在給2n個位置賦值的過程中,需要保持剩餘的 小於等於剩餘的 遍歷的過程中,每個位置先嘗試...
四對括號可以有多少種匹配排列方式 新解法
四對括號 那麼有4個 右括號 該題可演化為在黑色下劃線位置填左括號。容易得知 第1個位置 最多填4個,但不能為0個,第2個位置最多填3個,可以為0個,第3個位置最多填2個,第四個最多填1個。若有n對括號 由此得出結論,每個位置不得填超過n i 1個左括號,第乙個位置要求不能填0個。再加上乙個條件,所...