n對括號的匹配方式 卡特蘭數

2021-06-19 08:36:54 字數 1232 閱讀 7364

4對括號有多少種可能的合法匹配方式?n對括號呢?

網路上可以搜到很多相關的題目和解答,但是鮮有易懂的推導過程。這裡記錄一種推導過程如下:

結論:對於n對括號,合法的排列共有c(n,2n) - c(n+1,2n)種.

分析:1.考慮n對括號,共有n個 ( 和n個)。

對於其全排列,可以看做是2n個空,將n個 ( 放入其中任意n個空中, 剩餘的位置由 ) 填充,顯然其全排列的個數為

c(n,2n)

2.在全排列中,包含一部分非法的排列,我們從中減去非法的排列個數,即可得到合法的排列數目。問題規模被縮小。考慮所有排列中,非法排列的個數。

3.先來觀察非法排列的特性,我們假設(為1,)為-1,對於任意乙個非法排列a1,a2 ... an ,比存在乙個k,使得

a1+a2+a3..ak<0

因為如果這個和小於0,說明到k位置-1出現的次數比1多,即右括號出現的次數比左括號多,即該組合是非法的。

4. 對於乙個非法排列,必存在乙個k,使得a1+a2+a3..ak<0,給出乙個n=3時具體的排列:

1, -1, 1, -1,-1, 1

在k=5時,出現了非法情況。

我們將1~5元素翻轉,即1和-1置換,那麼該序列就變成了

-1, 1, -1, 1, 1, 1

這個翻轉的序列中,有n+1個1,n-1個-1

我們再觀察這個翻轉後的序列,對於有n+1個1,n-1個-1的排列,共有c(n+1,2n)種。而對於這種非法的排列:

總是存在乙個最小的k,我們只需要從第1個到第k個元素翻轉回去,就能變成對於有n個1,n個-1的情況下的非法排列。同樣,每乙個n個1,n個-1的情況下的非法排列也會對應乙個n+1個1,n-1個-1的排列。

例如:1, 1, 1, 1, -1, -1 --->從k=1翻轉 -1,1,1,1,-1,-1

-1, 1, 1, 1, 1, -1 --->從k=2翻轉 1,-1,-1,1,1,-1

(這裡不是很容易理解,需要自己畫圖分析)

5.所以可以推得,非法排列的個數為c(n+1,2n),

6.最終可得結論:對於n對括號,合法的排列共有c(n,2n) - c(n+1,2n)種.

求n對括號的排列組合(卡特蘭數)

求n對括號的排列組合 卡特蘭數 關鍵 從起始位置至右的任意序列,左括號的數目 右括號的數目 void generateparenthesis int n void generate int leftnum int rightnum string s 只要左括號還有,就可以列印 if leftnum ...

url pattern的匹配方式

乙個元素用於對映乙個已經註冊的servlet的乙個對外訪問路徑,它包含有兩個子元素 和分別用於指定servlet的註冊名稱和servlet的對外訪問路徑。name hello hello.html servlet的對外訪問路徑的 可以用 萬用字元替換它有兩種規定的格式 a.副檔名 匹配.do結尾的u...

n對括號可以有多少種匹配排列方式 演算法面試題

問題 n對括號可以有多少種匹配排列方式?比如兩對括號可以有兩種 和 思路 問題可轉化為 在乙個string中包含兩個字元 和 他們出現的次數都為n,並且任何時候 出現的次數總是 出現的次數。解決方案 遞迴 標誌 l 左括號出現的次數,r 右括號出現的次數,n 括號對數,s 儲存符合要求的排列字串,n...