LeetCode的第22題,括號的生成


22. 括號生成


 

給出 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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM