【LeetCode每日一题】22. Generate Parentheses
时间:2022-07-22
本文章向大家介绍【LeetCode每日一题】22. Generate Parentheses,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目描述
Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
For example, given n = 3, a solution set is:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
题解
暴力破解
- 生成所有可能的括号组合;
- 针对每一种组合,判断是否有效:有效,保留;无效,舍弃。
- 有效性验证:左括号开始,能形成括号对。
解法:
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> result;
if (n < 0) return result;
generateAll(n, 0, "", result);
return result;
}
private:
void generateAll(int n, int pos, string temp, vector<string> &res){
if (pos == 2 * n){
if(valid(temp)){
res.push_back(temp);
}
}
else{
temp += '(';
generateAll(n, pos+1, temp, res);
temp.pop_back();
temp += ')';
generateAll(n, pos+1, temp, res);
}
}
bool valid(string temp){
int balance = 0;
for (auto c: temp){
if (c == '(') balance += 1;
else balance -= 1;
if (balance < 0) return false;
}
return balance == 0;
}
};
缺点是:时间复杂度太大。
bfs/递归法
在生成过程中进行剪枝,及时舍弃无效的情况:
- 使用两个变量left、right,分别表示生成括号对中的仍然需要的括号数量,生成过程中,left <= right;如果出现left > right,说明生成的括号对无效,舍弃即可;
- 注意,递归结束条件,一种是生成字符对无效,另一种是生成最终的结果对。
代码:
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> result;
if (n < 0) return result;
helper(n, n, "", result);
return result;
}
private:
void helper(int left, int right, string tmp, vector<string> &res){
if (left < 0 || right < 0 || left > right) return;
if (left == 0 && right == 0){
res.push_back(tmp);
return;
}
helper(left-1, right, tmp+'(', res);
helper(left, right-1, tmp+')', res);
}
};
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Springboot + RabbitMQ 用了消息确认机制,感觉掉坑里了!
- 一款功能简约到可怜的SQL 客户端!
- 震惊!ConcurrentHashMap里面也有死循环,作者留的“彩蛋”?
- Python GUI项目实战(六)实现添加学生信息的功能
- 打卡群刷题总结0816——三角形最小路径和
- 打卡群刷题总结0814——二叉树展开为链表
- 打卡群刷题总结0813——二叉树展开为链表
- 打卡群刷题总结0812——路径总和 II
- SQL中CASE表达式的妙用
- 2w 字 + 40 张图带你参透并发编程!
- RSA 敏感数据加解密方案
- 极客算法训练笔记(一),算法学习方法篇
- 链表:听说用虚拟头节点会方便很多?
- 从JVM设计者的角度来看.class文件结构,一文弄懂.class文件的身份地位
- 抓包分析UDP,TCP和UDP的区别说不上五条就进来看看吧