网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
分析
- 首先想到的是全排列排列方式,然后再从中挑选满足括号规则的序列。每个字符只可能是 ‘(’ 或者 ‘)’ 两种选择,所以全排列的数量是 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();
![img](https://img-blog.csdnimg.cn/img_convert/14e95817de8e8b85c840cdb98ebe4048.png)
![img](https://img-blog.csdnimg.cn/img_convert/7d43cfbfd5de9fdbf1a67ee80a58e7d1.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**
中...(img-V76idBvq-1715703346748)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**