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] ...
随机推荐
- 【MYSQL】DDL语句
介绍:DDL语句,即数据定义语句,定义了不同的数据段,数据库表.表.列.索引等数据库对象:例如,create.drop.alter 适用对象:一般是由数据库管理员DBA使用 1.连接数据库 mysql ...
- Vue使用Ref跨层级获取组件实例
目录 Vue使用Ref跨层级获取组件实例 示例介绍 文档目录结构 安装vue-ref 根组件自定义方法[使用provide和inject] 分别说明各个页面 结果 Vue使用Ref跨层级获取组件实例 ...
- pandas高级操作
pandas高级操作 import numpy as np import pandas as pd from pandas import DataFrame,Series 替换操作 替换操作可以同步作 ...
- hive搜索报错
在自己搭建的集群上执行hive搜索语句 select count(*) from ods_event_log where dt='2019-12-14' group by dt; 报错如下: Stat ...
- Go 如何实现热重启
https://mp.weixin.qq.com/s/UVZKFmv8p4ghm8ICdz85wQ Go 如何实现热重启 原创 zhijiezhang 腾讯技术工程 2020-09-09
- https://www.cnblogs.com/AloneSword/p/3209653.html
proc/sys/net/ipv4/下各项的意义 - 孤剑 - 博客园 https://www.cnblogs.com/AloneSword/p/3209653.html
- cpdd 坐标:SD
updata on:2021.1.17 闲来无事继续鸽 性别:男 先鸽一会想起来再填/se
- java关键字static使用总结
java关键字static使用总结 1.static修饰的方法被称之为静态方法也叫做类方法,加static的方法,可以通过类名直接访问,不加static的方法只能通过对象名访问. 静态方法可以直接通过 ...
- 【.NET 与树莓派】i2c(IIC)通信
i2c(或IIC)协议使用两根线进行通信(不包括电源正负极),它们分别为: 1.SDA:数据线,IIC 协议允许在单根数据线上进行双向通信--这条线既可以发送数据,也可以接收数据. 2.SCL:时钟线 ...
- win10自带输入法突然变成了繁体
有可能是在使用Eclipse/MyEclipse的Ctrl + Shift + F进行代码格式化的时候与输入法的热键冲突了