小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
题目描述
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
有效括号组合需满足:左括号必须以正确的顺序闭合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/generate-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路分析
- 今天的每日一题是括号生成问题,题干指出有效括号组合需满足:左括号必须以正确的顺序闭合。也就是说,生成括号的时候,需要考虑左右括号的顺序和数量。
- 我们采用深度优化的思路解题,当左右括号数量为0的时候,递归终止。当剩余左括号数量大于剩余右括号数量的时候,不是有效的括号,递归终止。
- 依次使用左括号,右括号,得到如下代码。
通过代码
class Solution {
public List<String> generateParenthesis(int n) {
List<String> ans = new ArrayList<>();
if (n == 0) {
return ans;
}
dfs("", n, n, ans);
return ans;
}
public void dfs(String curStr, int left, int right, List<String> res) {
if (left == 0 && right == 0) {
res.add(curStr);
return;
}
if (left > right) {
return;
}
if (left > 0) {
dfs(curStr + "(", left - 1, right, res);
}
if (right > 0) {
dfs(curStr + ")", left, right - 1, res);
}
}
}
总结
- 上述算法的时间复杂度是O(n), 空间复杂度是O(n)
- 括号相关的题目还有有效括号的判断,可以一并练习一下,归纳总结,形成解一类题的思路和方法。
- 坚持算法每日一题,加油!