zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Redis 集群方案
    Redis集群搭建
    Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS
    为什么分布式一定要有Redis?
    如何准备Java初级和高级的技术面试
    SpringBoot自动配置原理
    高德地图-- 云图管理台
    GeoJSON格式规范说明
    webGis概念
    npm压缩js文件
  • 原文地址:https://www.cnblogs.com/andingding-blog/p/8960817.html
Copyright © 2011-2022 走看看