【LeetCode Hot 100】22. 括号生成

news/2024/9/29 13:17:04

题目描述

要求生成所有“合法”的括号字符串,就首先需要弄清楚括号字符串的合法性定义,也就是说如果我们现在有一个由小括号组成的字符串,该如何判断其是否符合要求。此前做过判断括号串是否合法的题目,那道题目中一般在遍历过程中维护一个栈,因为每个后括号都需要在已经遍历的子串中找到自己对应的前括号。这个题目中的合法性判断应该稍微简单一些,因为本题中只有小括号一种括号,因此我们可以将使用栈存储前面遍历的元素,简化为使用一个整型变量维护前括号的数量。这样一来,实际实现过程可以使用open存储前括号的数量,close存储后括号的数量,遍历结束时只有open == close时字符串才合法,此外,整个遍历过程中open >= close都需要成立,毕竟后括号必须有且仅有一个对应的前括号。

    bool check(string& s, int n) {int open = 0, close = 0;for (char c : s) {switch (c) {case '(':open++; break;case ')':close++; break;default:return false;}if (open > n) return false;if (close > open) return false;}return true;}

只关心openclose的大小关系,就可以将两个变量简化为一个变量balance,可以理解成前后括号的数量是否平衡。

    bool check(string& temp) {int balance = 0;for (const char& c : temp) {if (c == '(') balance++;else balance--;if (balance < 0) return false;}if (balance == 0) return true;else return false;}

明确了如何判断括号字符串的合法性,就可以想用回溯算法枚举所有可能的括号字符串,将所有合法的结果存入结果数组中返回。

    void backtrack(vector<string>& result, string& s, int idx, int n) {if (idx >= 2 * n) {if (check(s, n)) result.push_back(s);return;}s.push_back('(');backtrack(result, s, idx + 1, n);s.pop_back();s.push_back(')');backtrack(result, s, idx + 1, n);s.pop_back();}vector<string> generateParenthesis(int n) {vector<string> result;string s;backtrack(result, s, 0, n);return result;}

但是其实没有必要将整个串枚举完,而是可以在枚举过程中判断当前子串的合法性,即前括号与后括号的数量关系,因为显然如果前面一部分子串已经不合法,再继续深入下去的整个串一定不可能合法。这实际上也是一种对回溯算法的剪枝。

class Solution {
public:void backtrack(vector<string>& res, string& temp, int open, int close, int n) {if (temp.length() == n * 2) {res.push_back(temp);return;}if (open < n) {temp.push_back('(');backtrack(res, temp, open + 1, close, n);temp.pop_back();}if (close < open) {temp.push_back(')');backtrack(res, temp, open, close + 1, n);temp.pop_back();}}vector<string> generateParenthesis(int n) {vector<string> res;string temp;backtrack(res, temp, 0, 0, n);return res;}
};

顺带一提,这个题目需要对字符串进行回溯,C++中的字符串实际上就是一个字符向量数组,但是Java中需要使用StringBuilder或者StringBuffer提供的接口。根据力扣的提测结果,前者更快些(但是缺点在于线程不安全)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/66141.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

20241313刘鸣宇《计算机基础与程序设计》第一周学习总结

作业信息这个作业属于哪个课程 <班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业)这个作业的目标 <写上具体方面>作业正文 ... 本博客链接教材学习内容总结 第一章:信…

合天网络安全笔记-二-

合天网络安全笔记(二) P17:第15天:文件上传黑名单,白名单及数组绕过技巧 - 网络安全就业推荐 - BV1Zu411s79i 呃大家晚上好,我们先来测试一下呃,我麦的一个声音,大家能听到我声音的话,还还有声音,足够清楚的话,在讨论区这边扣个一,好的都应该都能听得到,然后的话还…

合天网络安全笔记-八-

合天网络安全笔记(八) P49:第13天:SSH远程登录密码破解、Mysql数据库密码破解 - 网络安全就业推荐 - BV1Zu411s79i 八八的一个端口给我们执行一个info,info之后,我们也是可以执行的,刚刚我们看你们有一些同学啊,就是使用的一些其他的一些cd的一些命令,我们在这里呢,在…

pbootcms系统修改登陆界面及后台相关版权标识

在 PBootCMS 系统中,修改登录界面及后台相关版权标识可以提升用户体验并增强品牌识别度。以下是详细的步骤和具体操作方法。 修改登录界面 步骤一:修改登录界面样式定位登录界面文件:找到 PBootCMS 的登录界面文件,通常位于 templates/default 目录下,文件名为 login.html…

PbootCMS文章列表没有缩略图时也不显示默认图片

在 PBootCMS 中,如果列表使用了缩略图显示,默认情况下即使没有上传缩略图也会显示默认图片。为了实现只有在上传了缩略图时才显示图片,可以使用 PBootCMS 自带的缩略图返回值进行判断。 以下是如何实现这一功能的具体代码示例: 示例代码 假设您有一个列表模板,需要判断是否…

清晰地了解 PBootCMS 详情页中常用的标签及其用途

标题:描述:显示文章标题。 示例代码:<h1>{content:title}</h1>浏览量:描述:显示文章的浏览量。 示例代码:<p>浏览量:{content:visits}</p>发布时间:描述:显示文章的发布时间。 示例代码:<p>发布时间:{content:date style=Y-m-d}</…

Pbootcms模板源码如何做好防护

为了提高 PBootCMS 模板的安全性,以下是一些详细的防护措施和步骤。这些措施可以有效减少网站被攻击的风险。 防护措施升级后台到最新版本:确保 PBootCMS 后台已升级到最新版本,以获得最新的安全补丁和功能改进。重命名关键文件夹:更改关键文件夹名称,使其不易被猜测。修改…

(二)认识网关和设计器

一:网关 打开浏览器输入localhost:8088即可打开网关管理页面对网关的配置都在Config里面 第一部分 System:导出导入项目,为网关分配许可证 第二部分 NetWorking:设置网关之间的互相连接(单个网关不需要配置) 第三部分 Security:涉及用户管理,权限管理,操作日志等于安全…