n對括號可以有多少種匹配排列方式(演算法面試題)
阿新 • • 發佈:2018-12-30
問題:n對括號可以有多少種匹配排列方式?比如兩對括號可以有兩種:()()和(())
思路:問題可轉化為:在一個string中包含兩個字元:'('和')',他們出現的次數都為n,並且任何時候'('出現的次數總是>=')'出現的次數。
解決方案(遞迴):
標誌:l: 左括號出現的次數,r:右括號出現的次數,n: 括號對數,s: 儲存符合要求的排列字串,num: 匹配排列種數
步驟:
1.如果r=n,即右括號已出現了n次,則num++,列印s,返回;
2.如果r=l,即左右括號出現次數相等(且<n,這由1知),則在s後面append字元‘(’,並l++,回到1(遞迴)
3.如果r<l,即右括號出現次數小於左括號,分兩種情況
(1),l=n,即左括號全部出現,則在s後面append字元')',並r++,回到1(遞迴)
(2),l<n,則接下來出現的字元可能是'(',也可能是')'。可以:
在s後append字元‘(’,l++,回到1(遞迴);然後把s最後的字元'('pop出來,append字元‘)’,l--,r++,再回到1(遞迴)
程式碼如下:
#include <string> #include <iostream> using namespace std; void parenthesisArrayCount(int l,int r,int n,string s,int& num) { if(r==n) { num++; cout<<s<<endl; return; } if(r==l) { s.append("("); l++; parenthesisArrayCount(l,r,n,s,num); } else//r<l { if(l==n) { s.append(")"); r++; parenthesisArrayCount(l,r,n,s,num); } else { s.append("("); l++; parenthesisArrayCount(l,r,n,s,num); s.pop_back(); l--; s.append(")"); r++; parenthesisArrayCount(l,r,n,s,num); } } return; } int main() { int num=0; string s; parenthesisArrayCount(0,0,4,s,num); cout<<"共"<<num<<"種"; return 1; }
執行結果: