博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[leetcode] Longest Valid Parentheses
阅读量:6158 次
发布时间:2019-06-21

本文共 2551 字,大约阅读时间需要 8 分钟。

hot3.png

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.

方案1:DP,dp[i]代表从索引i到末尾最长的有效括号组合的长度。

dp[s.length()-1]=0;从后向前逆向求解dp[i],

  1. 如果s[i]=')',则显然dp[i]=0;
  2. 如果s[i]='(',跳过dp[i+1]这段长度从j=i+1+dp[i+1]开始,如果j没越界并且s[j]='0',正好和s[i]匹配,则dp[i]=dp[i+1]+2;另外此时可能j之后的也可以连上,所以,可能要加上dp[j+1];
public class Solution {    public int longestValidParentheses(String s) {        if (s == null || s.length() < 2)            return 0;        int max = 0;        int[] dp = new int[s.length()];        dp[s.length() - 1] = 0;        for (int i = s.length() - 2; i >= 0; i--) {            char ch = s.charAt(i);            if (ch == '(') {                int j = i + 1 + dp[i + 1];                if (j < s.length() && s.charAt(j) == ')') {                    dp[i] = dp[i + 1] + 2;                    if (j + 1 < s.length())                        dp[i] += dp[j + 1];                }            }            max = Math.max(max, dp[i]);        }        return max;    }    public static void main(String[] args) {        System.out.println(new Solution().longestValidParentheses("(((()(()"));    }}

方案2:stack,时空复杂度都是O(n)。依次遍历字符串中的字符。如果是'(',压栈索引。如果是')',分情况讨论:

  1. 如果此时栈为空,表示前面没有需要匹配的或者前面已经计算完毕,')'不可能作为新的计算开始点,所以更新start为')'的索引+1.(start 表示当前能构成合法括号组合的起始处)
  2. 如果此时栈不空,则出栈,若此时栈为空,则表示当前匹配,更新结果为当前索引-start+1; 若此时不为空,则表示从此时栈顶元素下一位到当前索引是合法的,更新结果为当前索引-栈顶元素索引。

方案2:

import java.util.Stack;public class Solution {    public int longestValidParentheses(String s) {        if (s == null || s.length() < 2)            return 0;        Stack
stack = new Stack
(); int start = 0; int max = 0; for (int i = 0; i < s.length(); i++) { char ch = s.charAt(i); if (ch == '(') stack.push(i); else { if (stack.isEmpty()) start = i + 1; else { stack.pop(); if (stack.isEmpty()) max = Math.max(max, i - start + 1); else max = Math.max(max, i - stack.peek()); } } } return max; } public static void main(String[] args) { System.out.println(new Solution().longestValidParentheses("()()()))(()))(")); }}

参考:

转载于:https://my.oschina.net/jdflyfly/blog/284200

你可能感兴趣的文章
AutoReleasePool 和 ARC 以及Garbage Collection
查看>>
重新想象 Windows 8 Store Apps (9) - 控件之 ScrollViewer 基础
查看>>
乐在其中设计模式(C#) - 提供者模式(Provider Pattern)
查看>>
MVP Community Camp 社区大课堂
查看>>
GWT用frame调用JSP
查看>>
大型高性能ASP.NET系统架构设计
查看>>
insert select带来的问题
查看>>
EasyUI 添加tab页(iframe方式)
查看>>
mysqldump主要参数探究
查看>>
好记心不如烂笔头,ssh登录 The authenticity of host 192.168.0.xxx can't be established. 的问题...
查看>>
使用addChildViewController手动控制UIViewController的切换
查看>>
Android Fragment应用实战
查看>>
SQL Server查询死锁并KILL
查看>>
内存或磁盘空间不足,Microsoft Office Excel 无法再次打开或保存任何文档。 [问题点数:20分,结帖人wenyang2004]...
查看>>
委托到Lambda的进化: ()=> {} 这个lambda表达式就是一个无参数的委托及具体方法的组合体。...
查看>>
apache 伪静态 .htaccess
查看>>
unity3d 截屏
查看>>
ASP.NET MVC学习之控制器篇
查看>>
MongoDB ServerStatus返回信息
查看>>
分析jQuery源码时记录的一点感悟
查看>>