LeetCode - Longest Valid Parentheses | Darren's Blog



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 int longestValidParentheses(String s) {
        if (s == null || s.length() == 0)
            return 0;
        int longestLength = 0;      // Length of the longest valid parentheses
        int start = 0;  // The start index of the possibly longest valid parentheses
        Stack<Integer> stack = new Stack<Integer>();
        // One-pass scan
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '(') {   // Opening parenthesis
                stack.push(i);          // Push its index
            } else {        // Closing parenthesis
                if (stack.empty()) {    // No opening parenthesis to match
                    start = i + 1;      // i+1 is the start of next possibly LVP
                } else {
                    stack.pop();    // The index of the opening parenthesis matched by s[i]
                    if (stack.empty())  // s[start...i] is matched
                        longestLength = Math.max(longestLength, i-start+1);
                    else    // s[stack.peek()] is unmatched; s[stack.peek()+1...i] is matched
                        longestLength = Math.max(longestLength, i-stack.peek());
                }
            }
        }
 
        return longestLength;
    }
DP, Code from http://www.darrensunny.me/leetcode-longest-valid-parentheses/
这道题可以用一维动态规划逆向求解。假设输入括号表达式为String s,维护一个长度为s.length的一维数组dp[],数组元素初始化为0。 dp[i]表示从s[i]到s[s.length - 1]最长的有效匹配括号子串长度。则存在如下关系:
  • dp[s.length - 1] = 0;
  • 从i - 2 -> 0逆向求dp[],并记录其最大值。若s[i] == '(',则在s中从i开始到s.length - 1计算s[i]的值。这个计算分为两步,通过dp[i + 1]进行的(注意dp[i + 1]已经在上一步求解):
    • 在s中寻找从i + 1开始的有效括号匹配子串长度,即dp[i + 1],跳过这段有效的括号子串,查看下一个字符,其下标为j = i + 1 + dp[i + 1]。若j没有越界,并且s[j] == ‘)’,则s[i ... j]为有效括号匹配,dp[i] =dp[i + 1] + 2
    • 在求得了s[i ... j]的有效匹配长度之后,若j + 1没有越界,则dp[i]的值还要加上从j + 1开始的最长有效匹配,即dp[j + 1]。
public int longestValidParentheses(String s) {
    // Start typing your Java solution below
    // DO NOT write main() function
    int n = s.length();
    int[] dp = new int[n];
    java.util.Arrays.fill(dp, 0);
    int max = 0;
    for (int i = n - 2; i >= 0; i--) {
      if (s.charAt(i) == '(') {
        int j = i + 1 + dp[i + 1];
        if (j < n && s.charAt(j) == ')') {
          dp[i] = dp[i + 1] + 2;
          int k = 0;
          if (j + 1 < n) {
            k = dp[j + 1];
          }
          dp[i] += k;
        }
        max = Math.max(max, dp[i]);
      }
    }
    return max;
  }
Also check http://yucoding.blogspot.com/2013/01/leetcode-question-46-longest-valid.html
Read full article from LeetCode - Longest Valid Parentheses | Darren's Blog

No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts