現(xiàn)在給出一個偶數(shù)
n
赏枚,要求打印出所有的括號的組合,括號有兩種晓猛,分別是(
和)
要求: 左括號右邊一定得有一右括號和它對應(yīng)饿幅,右括號的左邊也一定有一個左括號對應(yīng),舉個例子戒职,當(dāng)n=2
的時候栗恩,只有()
這種情況,)(
這種情況是不可行的。
這個問題聽起來其實有點類似于給你一個數(shù)洪燥,比如10磕秤,然后打印出所有的二進制的可能性乳乌。
分析
那么,拿到手后亲澡,首先是進行簡單的分析钦扭,有左括號纫版,一定有一個右括號對應(yīng)床绪,而且必須是一對對的,那么可以有以下結(jié)論:
- 任意一個位置的左側(cè)的左括號的數(shù)量 大于等于 右括號的數(shù)量(第一個位置那么就肯定是左括號了)
- 任意一個位置的左側(cè)其弊,左括號的數(shù)量 小于等于
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("請輸入一個偶數(shù)");
}
}
return arr;
};
這里的參數(shù)說明如下:
- number 表示輸入的數(shù),這個數(shù)字必須是偶數(shù)梭伐。
- sumOnly 表示是否只統(tǒng)計數(shù)量痹雅,而不將結(jié)果存儲到數(shù)組中(防止數(shù)量太大,撐爆內(nèi)存)
- left 表示左括號的數(shù)量
- right 表示右括號的數(shù)量
- str 表示當(dāng)前的已經(jīng)拼接的字符串
- arr 存放結(jié)果的數(shù)組