Longest Valid Parentheses

原创 2015年11月19日 16:37:10

题目描述

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.

题目解答

解题思想

  • 遍历两遍, 第一遍把优先的’(’ 和 ‘)’ 转换成 ’ * ’ , 然后计算最长连续的*个数
  • 动态规划的思想

代码实现

public class Solution {
    public int longestValidParentheses(String s) {
       if(s == null || s.length() == 0)
            return 0;
        StringBuilder temp = new StringBuilder(s);
        ArrayDeque<Integer> stack = new ArrayDeque<>();
        for(int i = 0; i < s.length(); i++){
            if(s.charAt(i) == '(')
                stack.push(i);
            else if(!stack.isEmpty()){
                //注意
                temp.setCharAt(stack.pop(), '*');
                temp.setCharAt(i, '*');
            }
        }

        int longest = 0, part = 0;
        for(int i = 0; i < temp.length(); i++){
            if(temp.charAt(i) == '*'){
                part++;
            }else {
                longest = Math.max(longest, part);
                part = 0;
            }
        }

        //注意
        longest = Math.max(longest, part);
        return longest;
    }
}

DP

public class Solution {
    /**
     *
     1. 状态:
     DP[i]:以s[i-1]为结尾的longest valid parentheses substring的长度。

     2. 通项公式:
     s[i-1] = '(':
     DP[i] = 0

     s[i-1] = ')':找i前一个字符的最长括号串DP[i]的前一个字符j = i-2-DP[i-1]
     DP[i] = DP[i-1] + 2 + DP[j],如果j >=0,且s[j] = '('
     DP[i] = 0,如果j<0,或s[j] = ')'
     */
    public int longestValidParentheses(String s) {
       if(s == null || s.length() == 0 || s.length() == 1)
            return 0;


        int len = s.length();
        int[] dp = new int[len+1];
        Arrays.fill(dp, 0);

        int maxLen = 0;
        for(int i = 1; i < dp.length; i++){
            int j = i-2-dp[i-1];
            if(s.charAt(i-1) == '(' || j < 0 || s.charAt(j) == ')')
                dp[i] = 0;
            else {
                dp[i] = dp[i-1]+2+dp[j];
                maxLen = Math.max(dp[i], maxLen);
            }
        }

        return maxLen;
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

每日算法之二十八:Longest Valid Parentheses

求最长合法匹配的长度,这道题可以用一维动态规划逆向求解。假设输入括号表达式为String s,维护一个长度为s.length的一维数组dp[],数组元素初始化为0。 dp[i]表示从s[i]到s[s....
  • yapian8
  • yapian8
  • 2014年06月03日 11:08
  • 1109

LeetCode: Longest Valid Parentheses (求最长有效匹配括号子串的长度)

题目描述: Given a string containing just the characters'(' and')', find the length of the longest val...
  • abcbc
  • abcbc
  • 2013年04月20日 02:29
  • 6234

【LeetCode-面试算法经典-Java实现】【032-Longest Valid Parentheses(最长有效括号)】

【032-Longest Valid Parentheses(最长有效括号)】【LeetCode-面试算法经典-Java实现】【所有题目目录索引】原题  Given a string containi...
  • DERRANTCM
  • DERRANTCM
  • 2015年07月26日 06:46
  • 2081

栈——longest-valid-parentheses(最长有效括号长度)

题目描述 Given a string containing just the characters'('and')', find the length of the longest valid ...
  • jingsuwen1
  • jingsuwen1
  • 2016年06月02日 19:48
  • 112

leetcode:Longest Valid Parentheses 使用动态规划O(n)思路

Given a string containing just the characters '(' and ')', find the length of the longest valid (w...
  • tingting256
  • tingting256
  • 2015年09月27日 17:08
  • 394

longest valid parentheses--LeetCode

Given a string containing just the characters '(' and ')', find the length of the longest valid (wel...
  • yusiguyuan
  • yusiguyuan
  • 2015年03月25日 16:59
  • 601

Leetcode: Longest Valid Parentheses

Given a string containing just the characters '(' and ')', find the length of the longest valid (we...
  • doc_sgl
  • doc_sgl
  • 2013年10月03日 12:05
  • 3077

leetcode 032 Longest Valid Parentheses

Given a string containing just the characters'(' and ')', find the length of the longest valid (well...
  • jnuyanfa
  • jnuyanfa
  • 2016年04月28日 23:53
  • 202

LeetCode_32---Longest Valid Parentheses

Longest Valid Parentheses  Total Accepted: 36685 Total Submissions: 176120My Submissions Quest...
  • bingbing8219
  • bingbing8219
  • 2015年06月15日 16:43
  • 285

leetcode Longest Valid Parentheses

这个星期没有做题,跑出去玩了一圈。投个实习感觉被鄙视了,回来继续学习算了。 Given a string containing just the characters '(' and...
  • hefeiguo
  • hefeiguo
  • 2013年11月27日 13:59
  • 1298
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Longest Valid Parentheses
举报原因:
原因补充:

(最多只允许输入30个字)