zoukankan      html  css  js  c++  java
  • 括号生成(Python and C++解法)

    题目:

      数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。

    示例:

    输入:n = 3
    输出:[
    "((()))",
    "(()())",
    "(())()",
    "()(())",
    "()()()"
    ]

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/generate-parentheses

    思路:

      在括号没有完全匹配之前,左括号的数量应当小于右括号的数量。使用递归完成括号生成任务。

    Python解法:

     1 class Solution(object):
     2     def generate_parenthesis(self, n):
     3         self.list = []  # 存储最终结果
     4         self._gen(0, 0, n, "")  # 初始化,""之间不能有空格
     5         return self.list
     6 
     7     def _gen(self, left_used, right_used, n, result):  # left_used:左括号使用的个数;right_used:右括号使用的个数
     8         if left_used == n and right_used == n:  # 递归终止条件
     9             self.list.append(result)  # 往最终结果中加入当前结果
    10             return
    11         if left_used < n:  # 最后一个括号不能是左括号,所以不能取等于号
    12             self._gen(left_used+1, right_used, n, result+"(")
    13         if right_used <= n and right_used < left_used:  # 当right_used<n时,还必须满足right_used < left_used
    14             self._gen(left_used, right_used+1, n, result+")")
    15 
    16 
    17 if __name__ == '__main__':
    18     s = Solution()
    19     print(s.generate_parenthesis(3))  # ['((()))', '(()())', '(())()', '()(())', '()()()']

    C++解法:

     1 #include "pch.h"
     2 #include <iostream>
     3 #include <vector>
     4 #include <string>
     5 using namespace std;
     6 
     7 class Solution {
     8 public:
     9     vector<string> list;
    10     vector<string> generateParenthesis(int n) {
    11         _gen(0, 0, n, "");
    12         return list;
    13     }
    14 
    15     void _gen(int leftUsed, int rightUsed, int n, string result) {
    16         if (leftUsed == n && rightUsed == n) {
    17             list.push_back(result);
    18             return;
    19         }
    20         if (leftUsed < n)  // 最后一个括号不能是左括号,所以不能取等于号
    21             _gen(leftUsed + 1, rightUsed, n, result + "(");
    22         if (rightUsed <= n && rightUsed < leftUsed)  // 当right_used<=n时,还必须满足right_used < left_used
    23             _gen(leftUsed, rightUsed + 1, n, result + ")");
    24     }
    25 };
    26 
    27 int main() {
    28     Solution s;
    29     for (auto c : s.generateParenthesis(3))
    30         cout << c << " ";  // ((())) (()()) (())() ()(()) ()()()
    31 }
  • 相关阅读:
    apply()与call()的区别
    VS Code 配置vue开发环境
    settimeout 和 setinterval
    JAVA内存泄漏和内存溢出的区别和联系
    Oracle Distinct(过滤重复)用法
    Oracle Order By排序用法详解
    Oracle Select语句
    登陆权限--token的使用
    登陆权限--token 的生成和验证
    MySQL基础增删改查
  • 原文地址:https://www.cnblogs.com/kongzimengzixiaozhuzi/p/13056533.html
Copyright © 2011-2022 走看看