Leetcode 32. Longest Valid Parentheses
来源:互联网 发布:有道云协作 mac 编辑:程序博客网 时间:2024/06/06 00:12
问题描述
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.
问题分析:
题目要求计算最长合法括号的子串长度。括号匹配问题首先想到的是利用栈,利用start记录合法括号开始的位置,遇到左括号将下标入栈;遇到右括号出栈,如果当前栈为空,更新长度为i-start+1,如果栈不为空,更新长度为i-stack.top()
代码如下:
public int longestValidParentheses(String s) { if(s==null||s.length()==0) return 0; int n=s.length(); int max=0; int start=0; LinkedList<Integer> stack=new LinkedList<Integer>(); for(int i=0;i<n;i++){ if(s.charAt(i)=='(')//左括号入栈 stack.addFirst(i); else//右括号 { if(stack.size()==0)//不存在与之匹配的左括号 { start=i+1;//更新下一个合法左括号位置 } else//存在与之匹配的左括号 { stack.removeFirst(); if(stack.size()==0) max=Math.max(max,i-start+1); else max=Math.max(max,i-stack.get(0)); } } } return max; }
另一个利用动态规划的方法:从右向左计算当前左括号为合法子串的最右边左括号时子串长度,所以有状态转移矩阵:
if(s[j]==’)’) dp[i]=dp[i+1]+2//括号内部,dp[i]+=dp[j+1];//括号右边, (j=i+dp[i+1]+1,并且需要判断边界)
代码如下:
public int longestValidParentheses(String s) { if(s==null||s.length()==0) return 0; int n=s.length(); int[]dp=new int[n]; int max=0; for(int i=n-2;i>=0;i--){ if(s.charAt(i)=='('){ int j=i+dp[i+1]+1; if(j<n&&s.charAt(j)==')')//i括号中间的括号 { dp[i]=dp[i+1]+2; if(j+1<n)//i括号右边的完整括号 dp[i]+=dp[j+1]; } if(max<dp[i]) max=dp[i]; } } return max; }
阅读全文
0 0
- 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
- 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
- [LeetCode] 32. Longest Valid Parentheses
- leetcode 32. Longest Valid Parentheses
- leetcode 32.Longest Valid Parentheses
- leetcode 32. Longest Valid Parentheses
- 两个Android端基于蓝牙通讯的demo
- Git stash命令
- Java异常处理( try catch finally throw throws exception error)
- 上课后对【css】中清除浮动的总结
- 【NOIP模拟考一】组合数学 day1 third 子集
- Leetcode 32. Longest Valid Parentheses
- loadrunner简单使用——HTTP,WebService,Socket压力测试脚本编写
- 利用模板模式封装APP版本更新模块
- html中隐藏table指定标签的列
- java 面试题汇总
- 基于Socket通信的P2P聊天
- Scheme学习系列二:调用C代码
- C#实现一个局域网文件传输工具
- jquery html(), text(), val() attr()三个方法的设置值