求n對括號的合法組合

一道經典的面試題,求n對括號有多少種合法的組合。
抽象爲2n個位置,每一個位置能夠有2種取值,總共有2^2n個組合,附加約束條件是要符合括號的語法,用來剪枝。
括號語法的合法性條件:
初始化左括號和右括號的剩餘數量爲n,在給2n個位置賦值的過程當中,須要保持剩餘的'('小於等於剩餘的')'

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

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

void findParens(int l, int r, int& validCnt)
{
    if(l > r){return;} //剩餘的左括號大於了右括號,非法case
    if(l ==0 ){ //剩餘的左括號確定先被減小到0,剩餘全是右括號
        validCnt++;
        return;
    }

    findParens(l-1,r,validCnt); //將當前位置賦值爲左括號
    findParens(l, r-1,validCnt);//將當前位置賦值爲右括號
}
void testGenerateParens()
{
    int pair=10;
    int validCnt=0;
    findParens(pair,pair,validCnt);
    printf("%d\n",validCnt);
}spa

相關文章
相關標籤/搜索