leetcode 1541. 平衡括号字符串的最少插入次数
2024-09-01 19:45:19
问题描述
给你一个括号字符串 s ,它只包含字符 '(' 和 ')' 。一个括号字符串被称为平衡的当它满足:
任何左括号 '(' 必须对应两个连续的右括号 '))' 。
左括号 '(' 必须在对应的连续两个右括号 '))' 之前。
比方说 "())", "())(())))" 和 "(())())))" 都是平衡的, ")()", "()))" 和 "(()))" 都是不平衡的。
你可以在任意位置插入字符 '(' 和 ')' 使字符串平衡。
请你返回让 s 平衡的最少插入次数。
示例 1:
输入:s = "(()))"
输出:1
解释:第二个左括号有与之匹配的两个右括号,但是第一个左括号只有一个右括号。我们需要在字符串结尾额外增加一个 ')' 使字符串变成平衡字符串 "(())))" 。
示例 2:
输入:s = "())"
输出:0
解释:字符串已经平衡了。
示例 3:
输入:s = "))())("
输出:3
解释:添加 '(' 去匹配最开头的 '))' ,然后添加 '))' 去匹配最后一个 '(' 。
示例 4:
输入:s = "(((((("
输出:12
解释:添加 12 个 ')' 得到平衡字符串。
示例 5:
输入:s = ")))))))"
输出:5
解释:在字符串开头添加 4 个 '(' 并在结尾添加 1 个 ')' ,字符串变成平衡字符串 "(((())))))))" 。
代码
class Solution {
public:
int minInsertions(string s) {
//ans用于记录需要左括号和右括号的个数
//need记录需要的右括号的个数
int ans = 0,need = 0;
for(char& c:s)
{
if(c == '(')
{
//一个左括号对应两个右括号
need += 2;
if(need % 2 == 1)
{
++ans;//加上一个右括号
--need;//右括号的需求减一
}
}
else{
--need;
if(need == -1)
{
//右括号多了一个,需要一个左括号
++ans;
need = 1;//因为遇到一个右括号,所以只缺少一个右括号
}
}
}
return need + ans;
}
};
结果
执行用时:120 ms, 在所有 C++ 提交中击败了23.28%的用户
内存消耗:11.9 MB, 在所有 C++ 提交中击败了99.72%的用户
最新文章
- Web 前端开发精华文章推荐(jQuery、HTML5、CSS3)【系列十二】
- ios基础之UITableViewCell的重用(带示例原创)
- GMF中,删除节点和连线的另一种实现
- php获取网页中图片并保存到本地
- 检测INT3 软断点
- Python 正则表达式-OK
- 删除qq历史签名
- 转:云计算的三种服务模式:IaaS,PaaS和SaaS
- CentOS 6.7 安装配置BT下载工具Transmission
- shell学习指南-阅读笔记
- C# 百分比的获取
- Github上比较流行的PHP扩展库项目
- java web 学习笔记 jsp内置对象
- hdu 3473 划分树
- python3之模块SMTP协议客户端与email邮件MIME对象
- linux apache2部署php
- Newtonsoft的序列化和反序列化
- Redis常用操作-------List(列表)
- A1082. Read Number in Chinese
- ubuntu16.04安装nvidia ,cuda(待完善)
热门文章
- CF638A Home Numbers 题解
- LuoguP6857 梦中梦与不再有梦 题解
- CF1433A Boring Apartments 题解
- redis集群搭建,使用注意
- org.apache.jasper.runtime.ELContextImpl cannot be cast to org.apache.jasper.el.ELContextImpl
- .NET 云原生架构师训练营(对象过程建模)--学习笔记
- flink使用命令开始、停止任务
- tomcat 增加内存
- JAVA使用WebSocket显示实时在线浏览人数
- Simple16 字符压缩