Leetcode(32)-最长有效括号
给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: "(()"
输出: 2
解释: 最长有效括号子串为"()"
示例 2:
输入: ")()())"
输出: 4
解释: 最长有效括号子串为"()()"
思路:这个题目和前面一个有效括号很类似,不过那个是判断整个字符串是否是合法的括号,这个要从字符串中找到最长的有效字符串。还可以用栈来实现,也可以想到动态规划,不过个人觉得动态规划的方法比较难以理解。
用栈来实现,我一开始的实现方式是:遇到左括号就压栈,遇到右括号,则要判断栈顶是否是左括号来匹配,如果是的话,将栈顶出栈,配成一组合法的括号,但是这里应该注意,这里不能直接在最后结果上加上长度2。因为像这种情况“(()(”,虽然中间第二个和第三个可以匹配成一个合法括号,但是最后一个和第一个并没有匹配成功,所以前面的那个并不能算入结果中。我们可以想到,当我将栈顶出栈之后,如果栈为空了,证明我这个目前的字符串一定是合法的,而且是可计入结果的。
所以要先暂时存起来一个结果,栈为空时,才能计入最终的最长有效的长度中。
最后从第一个字符开始暴力求解,求以每个字符串为首的最长有效括号的长度,最后得到最大的一个长度。
int isValid(string s)
{
stack<int> sta;
int num=0;
int t=0;
for(int i=0;i<s.size();i++)
{
if(s[i]=='(' )
sta.push(s[i]);
else if(sta.empty())
{
return num;
}
else if(s[i]==')' && !sta.empty())
{
sta.pop();
t+=2;
if(sta.empty())
{
num+=t;
t=0;
}
}
else
{
return num;
}
}
return num;
}
int longestValidParentheses(string s)
{
int len=s.size();
if(len==0 || len==1) return 0;
int maxlen=0;
for(int i=0;i<len;i++)
{
maxlen=max(maxlen,isValid(s.substr(i,len)));
}
return maxlen;
}
上述的解法时间复杂度肯定是高的,因为它要从每个字符开始求解来找到最大值。
我们其实直接将字符的下标压栈,这样就可以通过下标的减法就可以得到字符串的长度了。从头遍历,当前字符为左括号时,压栈,当前字符为右括号时,分为栈中为空(重新选当前字符下一个为起始点),栈中为1(长度为j-i+1),栈中个数大于1(接着匹配,看以后是否还有合法的括号)
int longestValidParentheses(string s) {
int ans = 0;
stack<int> stk;
for (int i = 0, j = 0; j < s.size(); j++) {
if (s[j] == '(') {
stk.push(j);
} else {
if (stk.size() > 1) {
stk.pop();
ans = max(ans, j - stk.top());
} else if (stk.size() == 1) {
stk.pop();
ans = max(ans, j - i + 1);
} else {
i = j + 1;//i用来表示起始点
}
}
}
return ans;
}
Leetcode(32)-最长有效括号的更多相关文章
- LeetCode 32. 最长有效括号(Longest Valid Parentheses) 31
32. 最长有效括号 32. Longest Valid Parentheses 题目描述 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 每日一算法2019/6/ ...
- Java实现 LeetCode 32 最长有效括号
32. 最长有效括号 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 示例 1: 输入: "(()" 输出: 2 解释: 最长有效括号子串为 & ...
- leetcode:32 最长有效括号
题目: 给一个包含了'(' 和 ')'的字符串,求出其中最长有效括号的长度. 做题情况:自己做出来,但做了较长的时间. 思路:可以算得穷举法的时间复杂度为O(n^3).虽然这题求的是最长的长度,但是 ...
- Leetcode——32.最长有效括号【##】
@author: ZZQ @software: PyCharm @file: leetcode32_最长有效括号.py @time: 2018/11/22 19:19 要求:给定一个只包含 '(' 和 ...
- LeetCode 32. 最长有效括号(Longest Valid Parentheses)
题目描述 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 示例 1: 输入: "(()" 输出: 2 解释: 最长有效括号子串为 "( ...
- Leetcode32. 最长有效括号
32. 最长有效括号 做法 \(f_{i}\)以\(i\)结尾的最长匹配 前提为\(s[i]=')'\) \(s[i-1]='('\),则\(f[i]=f[i-2]+2\) \(s[i-1]=')'\ ...
- [LeetCode] 32. Longest Valid Parentheses 最长有效括号
Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...
- LeetCode 32 Longest Valid Parentheses(最长合法的括号组合)
题目链接: https://leetcode.com/problems/longest-valid-parentheses/?tab=Description Problem :已知字符串s,求出其 ...
- LeetCode(32):最长有效括号
Hard! 题目描述: 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 示例 1: 输入: "(()" 输出: 2 解释: 最长有效括号子串为 ...
- 【LeetCode 32】最长有效括号
题目链接 [题解] 设dp[i]表示以第i个字符结尾的最长有效括号的长度. 显然只要考虑s[i]==')'的情况 则如果s[i-1]=='(',则dp[i] = dp[i-2]+2; 如果s[i-1] ...
随机推荐
- 全球城市ZoneId和UTC时间偏移量的最全对照表
前言 你好,我是A哥(YourBatman). 如你所知,现行的世界标准时间是UTC世界协调时,时区已不直接参与时间计算.但是呢,城市名称or时区是人们所能记忆和容易沟通的名词,因此我们迫切需要一个对 ...
- 集成多种协议、用于 USB-A 和 TYPE-C 双端口输出的快充协议芯片IP2726
1. 特性 支持 1A1C 支持 USB-A 和 TYPE-C 双端口输出 单口输出支持全部快充协议 双口同时插入时降压到 5V 快充规格 集成 QC2.0/QC3.0/QC4/QC4+输 ...
- ././include/linux/kconfig.h:4:32: fatal error: generated/autoconf.h: No such file or directory 解决办法
我在编写内核驱动模块的时候报了一个非常奇怪的错误,如下图: 在目录下看了一下确实没有发现这个文件,感觉很奇怪,因为我记得之前编译模块是没有错误的,所以不可能是我代码写的有问题. 查阅了资料很多说要清除 ...
- LR_添加系统资源监控失败
1.服务开启情况:RPC.Rmote Resgistry.Network DDE.Server.Workstation.Network connection以上服务是否已开启 2.是否开了防火墙,如有 ...
- WinForm中实现按Enter将光标移动到下一个文本框
首先窗体加载出来是上面这个样子.有五个文本框,我们要实现的功能就是输入姓名后按Enter,使光标直接定位到手机号中. 在页面加载的时候我们就要获取所有文本框控件,并添加回车事件 private voi ...
- Caffeine 缓存库
介绍 Caffeine是一个基于Java8开发的提供了近乎最佳命中率的高性能的缓存库. 缓存和ConcurrentMap有点相似,但还是有所区别.最根本的区别是ConcurrentMap将会持有所有加 ...
- LVS负载均衡IP隧道模式原理介绍以及配置实战
LVS 基本工作原理 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间 PREROUTING 链首先会接收到用户请求,判断目标 IP 确定是本机 IP,将数 ...
- 配置CLion管理Qt项目国际化支持
随着Qt 6的发布,cmake也正式宣告接管qmake的工作了. 在之前的一篇博客里我介绍了如何使用cmake管理你的qt项目,不过有一点我没有讲,那就是对国际化(i18n)的处理. 今天我们就来介绍 ...
- Web漏洞扫描-AWVS
Web漏洞扫描-AWVS 一.AWVS概述 二.功能以及特点 三.AWVS界面 四.AWVS使用 相关优质博文: CSDN:帽子不够白:WEB渗透测试之三大漏扫神器 一.AWVS概述 Acunetix ...
- XSS、CSRF、SSRF联系&区别,防御
目录 区别和联系 防御 联系和区别 相同点: XSS,CSRF,SSRF三种常见的Web服务端漏洞均是由于,服务器端对用户提供的可控数据过于信任或者过滤不严导致的. 相同点: XSS,CSRF,SSR ...