22. 括號生成
給出 n 代表生成括號的對數,請你寫出一個函數,使其能夠生成所有可能的並且有效的括號組合。
例如,給出 n = 3,生成結果為:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
解決這個題的思路就是將所有的組合都寫出來,然后將對這些所有的結果進行篩選,留下符合的結果。
第一部分:列舉出所有的可能性結果
1、利用二進制來列舉結果,0表示‘(’,1表示‘)’,將所有的結果都表示成2*n位的二進制。然后對一個結果進行遍歷,刪除不滿足的結果,保留想要的結果。
2、對於這個結果的篩選的條件有三個,每一步都要看0和1的個數,當1比0的個數多的時候就返回False。在統計0和1的個數的以后,比較0和1的個數,如果不相等也返回False,如果相等就返回將二進制串轉換成括號形式的結果。
/** * @param {number} n * @return {string[]} */ var generateParenthesis = function(n) { if (n == 1) { return ["()"]; } let maxCombo = []; maxCombo[0] = 0; for (let i = 1; i < n * 2; i++) { if (i > n + 1) { maxCombo[i] = 0; } else { maxCombo[i] = 1; } } let maxComboCount = parseInt(maxCombo.join(''), 2); let leastComboCount = parseInt(Array(n).fill(1).join(''), 2); let results = []; for (let i = leastComboCount; i < maxComboCount; i++) { let binary = i.toString(2); let balancer_0 = n * 2 - binary.length; let balancer_1 = 0; let cont = false; let result = ''; for (let j = 0; j < balancer_0; j++) { result += '('; } for (let j = 0; j < binary.length; j++) { if (binary[j] == '0') { balancer_0 += 1; result += '('; } else { balancer_1 += 1; result += ')'; } if (balancer_1 > balancer_0) { cont = true; break; } } if (cont || balancer_0 != balancer_1) { continue; } results.push(result); } return results; };
下面是Python的代碼:
1 class Solution: 2 def generateParenthesis(self, n): 3 """ 4 :type n: int 5 :rtype: List[str] 6 """ 7 result = [] 8 if n==1: 9 result.append('()') 10 return result 11 else: 12 length = n*2-1 13 for i in range(0,pow(2,length)): 14 binary = bin(i)[2:] 15 for j in range(-1,length-len(binary)): 16 binary = '0'+binary 17 if self.Is_result(binary): 18 result.append(self.Is_result(binary)) 19 return result 20 def Is_result(self,binary): 21 number1 = 0 22 number0 = 0 23 result = '' 24 for i in binary: 25 if i=='0': 26 result = result + '(' 27 number0 = number0 + 1 28 else: 29 result = result + ')' 30 number1 = number1 +1 31 if number1>number0: 32 return False 33 if number1!=number0: 34 return False 35 else: 36 return result