0022.Generate-Parentheses

括号生成

1. 题目

1.1. 描述

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

1.2. 示例

示例 1

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

示例 2

输入:n = 1
输出:[“()”]

1.3. 提示

1 <= n <= 8

1.4. 思路

  • 回溯法。定义变量left和right分别表示剩余左右括号个数,递归遍历生成字符串
    • 若生成的字符串中右括号个数大雨左括号个数,放弃这条线
    • 若左右括号个数都为n时,则此时生成的字符串合法,存入结果
    • 若左括号个数小于n时,则字符串中可以添加左括号继续递归
    • 若右括号个数小于左括号时,则字符串中可以添加右括号继续递归
  • 时间复杂度为O($2^n$),空间复杂度为O($2^n$)

2. 代码

2.1. C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> ans;
dfs(0,0,ans,n,"");
return ans;
}
void dfs(int left,int right,vector<string> &ans,int n,string str){
if(left<right){ return; }
if(left==n&&right==n){
ans.push_back(str);
return;
}
if(left<n){
dfs(left+1,right,ans,n,str+"(");
}
if(left>right){
dfs(left,right+1,ans,n,str+")");
}
}
};

2.2. Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public List<String> generateParenthesis(int n) {
List<String> ans = new ArrayList<>();
dfs(0,0,ans,n,"");
return ans;
}
private void dfs(int left,int right,List<String> ans,int n,String str){
if(left<right){
return;
}
if(left==right&&left==n){
ans.add(str);
return;
}
if(left<n){
dfs(left+1,right,ans,n,str+"(");
}
if(left>right){
dfs(left,right+1,ans,n,str+")");
}
}
}
本文结束  感谢您的阅读
  • 本文作者: Wang Ting
  • 本文链接: /zh-CN/2017/07/18/0022-Generate-Parentheses/
  • 发布时间: 2017-07-18 15:27
  • 更新时间: 2024-12-23 16:10
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!