算法剑指 Offer II 085. 生成匹配的括号|22. 括号生成|面试题 08.09. 括号java / c / c++ / python / go / rust
剑指 Offer II 085. 生成匹配的括号|22. 括号生成|面试题 08.09. 括号:
正整数 n
代表生成括号的对数,请设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
样例 1:
输入:
n = 3
输出:
["((()))","(()())","(())()","()(())","()()()"]
样例 2:
输入:
n = 1
输出:
["()"]
提示:
- 1 <= n <= 8
分析
- 首先想到的是全排列排列方式,然后再从中挑选满足括号规则的序列。每个字符只可能是 ‘(’ 或者 ‘)’ 两种选择,所以全排列的数量是 22n 个。真正有效的括号序列远远少于这个量。
- 是否可以直接去穷举生成有效的括号序列呢?
- 首先要判断什么样的序列是有效的括号序列?
- 很显然,首先左右括号字符的数量应该相等。
- 右括号一定是匹配前面某个左括号。
- 所以只包含左右括号字符,并且从左往右看,右括号数始终小于等于左括号数,最终左右括号数相等的序列就是合理合法合规的括号序列了。
题解
java
class Solution {
public List<String> generateParenthesis(int n) {
List<String> ans = new ArrayList<>();
this.dfs(n, ans, new char[n * 2], 0, 0);
return ans;
}
private void dfs(int n, List<String> ans, char[] cs, int left, int right) {
if (left == n && right == n) {
ans.add(new String(cs));
return;
}
if (left < n) {
cs[left right] = '(';
dfs(n, ans, cs, left 1, right);
}
if (right < left) {
cs[left right] = ')';
dfs(n, ans, cs, left, right 1);
}
}
}
c
#define MAX_SIZE 1430
void dfs(int n, int *returnSize, char **ans, char *cs, int left, int right) {
if (left == n && right == n) {
ans[(*returnSize)] = calloc((n * 2 1), sizeof(char));
strcpy(ans[(*returnSize)], cs);
(*returnSize);
return;
}
if (left < n) {
cs[left right] = '(';
dfs(n, returnSize, ans, cs, left 1, right);
}
if (right < left) {
cs[left right] = ')';
dfs(n, returnSize, ans, cs, left, right 1);
}
}
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
char **generateParenthesis(int n, int *returnSize) {
*returnSize = 0;
char **ans = malloc(MAX_SIZE * sizeof(char *));
char *cs = calloc((n * 2 1), sizeof(char));
dfs(n, returnSize, ans, cs, 0, 0);
return ans;
}
c
class Solution {
private:
void dfs(int n, vector<string> &ans, string &buf, int left, int right) {
if (left == n && right == n) {
ans.push_back(buf);
return;
}
if (left < n) {
buf.push_back('(');
dfs(n, ans, buf, left 1, right);
buf.pop_back();
}
if (right < left) {
buf.push_back(')');
dfs(n, ans, buf, left, right 1);
buf.pop_back();
}
}
public:
vector<string> generateParenthesis(int n) {
vector<string> ans;
string buf;
dfs(n, ans, buf, 0, 0);
return ans;
}
};
python
class Solution:
def generateParenthesis(self, n: int) -> List[str]:
ans = []
def dfs(s, left, right):
if left == n and right == n:
ans.append(''.join(s))
return
if left < n:
s.append('(')
dfs(s, left 1, right)
s.pop()
if right < left:
s.append(')')
dfs(s, left, right 1)
s.pop()
dfs([], 0, 0)
return ans
go
func generateParenthesis(n int) []string {
var ans []string
var dfs func(cs []byte, left int, right int)
dfs = func(cs []byte, left int, right int) {
if left == n && right == n {
ans = append(ans, string(cs))
return
}
if left < n {
cs[left right] = '('
dfs(cs, left 1, right)
}
if right < left {
cs[left right] = ')'
dfs(cs, left, right 1)
}
}
dfs(make([]byte, n*2), 0, 0)
return ans
}
rust
impl Solution {
pub fn generate_parenthesis(n: i32) -> Vec<String> {
let mut ans = Vec::new();
fn dfs(n: usize, ans: &mut Vec<String>, buf: &mut String, left: usize, right: usize) {
if left == n && right == n {
ans.push(buf.clone());
return;
}
if left < n {
buf.push('(');
dfs(n, ans, buf, left 1, right);
buf.pop();
}
if right < left {
buf.push(')');
dfs(n, ans, buf, left, right 1);
buf.pop();
}
}
dfs(n as usize, &mut ans, &mut String::new(), 0, 0);
ans
}
}
原题传送门:https://leetcode-cn.com/problems/IDBivT/
原题传送门:https://leetcode-cn.com/problems/generate-parentheses/
原题传送门:https://leetcode.cn/problems/bracket-lcci/
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhhiggih
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22 -
excel打印预览压线压字怎么办
PHP中文网 06-22