給出一個偶數,獲取所有的括號組合

現在給出一個偶數n,要求打印出所有的括號的組合,括號有兩種,分別是()
要求: 左括號右邊一定得有一右括號和它對應,右括號的左邊也一定有一個左括號對應,舉個例子,當n=2的時候,只有()這種情況,)(這種情況是不可行的。

這個問題聽起來其實有點類似于給你一個數,比如10,然后打印出所有的二進制的可能性。

分析

那么,拿到手后,首先是進行簡單的分析,有左括號,一定有一個右括號對應,而且必須是一對對的,那么可以有以下結論:

  1. 任意一個位置的左側的左括號的數量 大于等于 右括號的數量(第一個位置那么就肯定是左括號了)
  2. 任意一個位置的左側,左括號的數量 小于等于 n/2

那么就可以通過這兩點來進行遞歸的判斷,代碼如下:

function getSynbols(number, sumOnly, left, right, str, arr) {
    arr = arr == undefined ? (sumOnly ? [0] : []) : arr;
    left = left || 0;
    right = right || 0;
    str = str || '';
    let half = number / 2;
    if (right + left == number) {
        if (sumOnly) {
            arr[0]++;
        } else {
            arr.push(str);
        }
    } else {
        if (number % 2 == 0) {
            if (left < half) {
                getSynbols(number, sumOnly, left + 1, right, str + "(", arr);
                if (left > 0 && right < left) getSynbols(number, sumOnly, left, right + 1, str + ")", arr);
            } else {
                getSynbols(number, sumOnly, left, right + 1, str + ")", arr);
            }
        } else {
            console.log("請輸入一個偶數");
        }
    }
    return arr;
};

這里的參數說明如下:

  1. number 表示輸入的數,這個數字必須是偶數。
  2. sumOnly 表示是否只統計數量,而不將結果存儲到數組中(防止數量太大,撐爆內存)
  3. left 表示左括號的數量
  4. right 表示右括號的數量
  5. str 表示當前的已經拼接的字符串
  6. arr 存放結果的數組
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容