【leetcode with java】32 Longest Valid Parentheses O(n)
来源:互联网 发布:超人预算软件 编辑:程序博客网 时间:2024/05/17 07:04
这个题目leetcode上提示用动态规划,但是那样要O(n^2)。我自己想出了一个O(n)的算法,并提交通过。
【题目】
Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.For "(()", the longest valid parentheses substring is "()", which has length = 2.Another example is ")()())", where the longest valid parentheses substring is "()()", which has length = 4.Tags: Dynamic Programming ,String
【思路】
注意到一个规律:只要从开头当前位置的子串中左括号的个数小于右括号的个数,那么该子串便不能够再同右边任何子串构成合法子串。
这时,只要记录当前子串的最长合法子串,然后从下一个位置开始查找最长子串。
局部最长合法子串长度的记录:这里用到了一个Hashtable<Integer,Integer>,key为记录该长度时栈中左括号的个数,value为每次遇
到右括号时该右括号所在合法子串的长度。
【上码】
import java.util.Hashtable;import java.util.Stack;/* * 参考:未参考他人算法 * T = O(n) * leetcode上提示用动态规划,但是那样要O(n^2) */public class Solution {public int longestValidParentheses(String s) {int maxLen = 0;if(s==null||s.length()==0)return maxLen;Stack<Character> stack = new Stack<Character>();Hashtable<Integer, Integer> hashtable = new Hashtable<Integer, Integer>();int len = s.length();int left=0,right=0,L=0;for(int p=0;p<len;p++){if(s.charAt(p) == ')')if(stack.isEmpty()){//maxLen = maxLen>L?maxLen:L;right++;}else if(stack.peek()=='('){stack.pop();Integer v1 = hashtable.get(left);if(v1 != null){L += v1;hashtable.remove(left);}left--;L+=2;Integer v2 = hashtable.get(left);if(v2 != null){L += v2;}hashtable.put(left, L);}else {stack.push(')');right++;}else {stack.push('(');left++;}maxLen = maxLen>L?maxLen:L;L = 0;if(left<right){stack.clear();hashtable.clear();left = 0;right = 0;//L = 0;}}return maxLen;}}
0 0
- 【leetcode with java】32 Longest Valid Parentheses O(n)
- leetcode Longest Valid Parentheses O(n)解法
- LeetCode: Longest Valid Parentheses O(n)时间 O(1)空间
- LeetCode 31. Longest Valid Parentheses O(n)实现
- LeetCode Longest Valid Parentheses的O(N)解法
- [leetcode-32]Longest Valid Parentheses(java)
- [Leetcode] Longest Valid Parentheses (Java)
- [LeetCode][Java] Longest Valid Parentheses
- leetcode:Longest Valid Parentheses 【Java】
- LeetCode : Longest Valid Parentheses [java]
- Longest Valid Parentheses leetcode java
- LeetCode(32)Longest Valid Parentheses
- [Leetcode] #32 Longest Valid Parentheses
- [Leetcode] 32 - Longest Valid Parentheses
- LeetCode 32 Longest Valid Parentheses
- Leetcode 32 Longest Valid Parentheses
- leetcode 32 -- Longest Valid Parentheses
- LeetCode---(32)Longest Valid Parentheses
- Dundas推出AWS上的大数据可视化解决方案
- Cocos2d-X3.0 ----- 内存管理源码分析
- 回车换行的不同以及 转义字符和ASCII码值—(附ASCII码表)
- Android启动画面实现
- 线程的4中状态
- 【leetcode with java】32 Longest Valid Parentheses O(n)
- android:windowSoftInputMode 无效的原因
- 15.首页查询一级分类商品列出左侧分类信息
- 几个iOS工程通用模块介绍
- Android实现数据存储技术
- SQL Profiles-STA使用方法
- 面向接口编程
- Hiring data scientists
- LBP算法的Matlab代码