leetcode:32 最长有效括号
题目:
给一个包含了'(' 和 ')'的字符串,求出其中最长有效括号的长度。
做题情况:自己做出来,但做了较长的时间。
思路:可以算得穷举法的时间复杂度为O(n^3)。虽然这题求的是最长的长度,但是用不了动态规划,因为无法找到一个合适的状态。考虑能不能在O(n)内实现,即遍历一次字符串。发现可以通过栈来做。具体方法如下:
对于当前字符,如果是"(",直接压入栈中。如果是")",要分以下几种情况讨论:
(1)如果当前栈为空,说明不存在与当前右括号配对的左括号,直接continue.
(2)如果当前栈大小为1:
a.如果栈顶元素是"(",则找到一个有效的括号序列,弹出栈顶元素,并压入这个序列的长度2;
b.如果栈顶元素是数字,说明不存在与当前右括号配对的左括号,且由于插入了一个右括号,之前得到的括号序列无法更长,需要弹出栈顶元素。
(3)如果当前栈的大小大于等于2:
弹出栈顶元素
a.如果是"(",则找到一个为2的有效序列,再检查栈顶元素,如果是数字,说明可以与前面找到的括号序列合并为一个更大的序列,与其相加后压入栈,否则直接将2压入栈;
b.如果是数字,由于当前的栈大小大于等于2,则下一个栈的元素一定是“(”,弹出后压入合并后的序列长度,压之前再检查,如果栈顶元素还是为数字,则再合并,再压入。
代码如下:
public class Solution {
public int longestValidParentheses(String s) {
int n = s.length();
Stack<Integer> stack = new Stack<Integer>();
int max = 0;
for(int i=0;i<n;i++){
if(s.charAt(i)=='('){
stack.push(0);
}else{
if(stack.size()==0){
continue;
}else if(stack.size()==1){
if(stack.pop()==0){
stack.push(2);
max = Math.max(max,2);
}
}else{
if(stack.peek()==0){
stack.pop();
int num = 2;
if(stack.peek()!=0){
num += stack.pop();
}
stack.push(num);
max = Math.max(max,num);
}else{
int temp = stack.pop();
stack.pop();
temp+=2;
if(!stack.isEmpty()&&stack.peek()!=0){
temp += stack.pop();
}
max = Math.max(max,temp);
stack.push(temp);
}
}
}
}
return max;
}
}
leetcode:32 最长有效括号的更多相关文章
- LeetCode 32. 最长有效括号(Longest Valid Parentheses) 31
32. 最长有效括号 32. Longest Valid Parentheses 题目描述 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 每日一算法2019/6/ ...
- Java实现 LeetCode 32 最长有效括号
32. 最长有效括号 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 示例 1: 输入: "(()" 输出: 2 解释: 最长有效括号子串为 & ...
- 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] ...
随机推荐
- JavaWeb学习笔记——JSP标准标签库JSTL
- MySQL学习笔记——索引和视图
索引(index)和管理索引 模式中的一个数据库对象 作用:在数据库中用来加速对表的查询 创建:自动在主键和唯一键上面创建索引 通过使用快速路径访问方法快速定位数据,减少了磁盘的I/O 与表独立存放, ...
- Ansible facts
facts组件是Ansible用于采集被管理机器设备信息的一个功能.可以使用setup模块查机器的所有facts信息,可以使用filter来查看指定信息.整个facts信息被包装在一个json格式的数 ...
- Python开发【第六篇】:模块
模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...
- Java多线程编程核心技术---线程间通信(一)
线程是操作系统中独立的个体,但这些个体如果不经过特殊处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一.线程间通信可以使系统之间的交互性更强大,在大大提高CPU利用率的同时还会使程序员对各 ...
- intelligencia.urlrewriter使用
见github: https://github.com/sethyates/urlrewriter
- [Asp.net mvc]jquery.form.js无刷新上传
写在前面 最近在自己的网盘项目中想用ajax.beginform的方式做无刷新的操作,提交表单什么的都可以,但针对文件上传,就是个鸡肋.在网上查找了发现很多人都遇到了这个问题,大部分都推荐使用jque ...
- windows 杂项
农企amd的Radeon: 蓝宝石-镭 显卡m330只是 m200的马甲版本, nvidia的Geforce: ge: geometry : 几何很强, 精视 radeon倾向于单精度浮点计算很强, ...
- sql拼音简写函数
USE [HotelDB]GO /****** Object: UserDefinedFunction [dbo].[fn_GetPy] Script Date: 2016/1/4 13:29:13 ...
- SQLServer安装错误之--->无法打开项 UNKNOWN\Components\DA42BC89BF25F5BD0AF18C3B9B1A1EE8\c1c4f01781cc94c4c8fb1542c0981a2a
– 错误 1402.无法打开项 UNKNOWN\Components\7ABFE44842C12B390AF18C3B9B1A1EE8\54D21D49F3A8C1C49AC11A1B6445A83E ...