• leetcode -- Longest Valid Parentheses


    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.

    Version 1

    仅仅考虑了()()这种情况,当input:()(())时输出为2,expected为:6

    (())也是valid parentheses

     1 public class Solution {
     2     public int longestValidParentheses(String s) {
     3         // Start typing your Java solution below
     4         // DO NOT write main() function
     5         int max = 0;
     6         int len = s.length();
     7         Stack<Character> stack = new Stack<Character>();
     8         int lastIndex = -1;
     9         
    10         int curLen = 0;
    11         for(int i = 0; i < len; i++){
    12             if(!stack.empty()){
    13                 char top = stack.peek();
    14                 char c = s.charAt(i);
    15                 
    16                 if(match(top, c)){
    17                     if(i - lastIndex == 2){
    18                        curLen += 2; 
    19                        lastIndex = i;
    20                        if(curLen > max){
    21                             max = curLen;
    22                        }
    23                     } else {
    24                         curLen = 2;
    25                         if(curLen > max){
    26                             max = curLen;
    27                         }
    28                         lastIndex = i;
    29                     }
    30                     stack.pop();
    31                 } else {
    32                     stack.push(c);
    33                 }
    34             } else {
    35                 char c = s.charAt(i);
    36                 stack.push(c);
    37             }
    38         }
    39         
    40         return max;
    41     }
    42     
    43     boolean match(char a, char b){
    44         if(a == '(' && b == ')'){
    45             return true;
    46         } else {
    47             return false;
    48         }
    49     }
    50 }

    Version 2:

    通过维护一个左边界来计算Longest Valid Parentheses

     1 class Node{
     2     char c;
     3     int i;
     4     public Node(char c, int i){
     5         this.c = c;
     6         this.i = i;
     7     }
     8 }
     9 
    10 public class Solution {
    11     public int longestValidParentheses(String s) {
    12         // Start typing your Java solution below
    13         // DO NOT write main() function
    14         int max = 0;
    15         int len = s.length();
    16         Stack<Node> stack = new Stack<Node>();
    17         int lastIndex = -1;
    18         
    19         int curLen = 0;
    20         for(int i = 0; i < len; i++){
    21             if(!stack.empty()){
    22                 Node top = stack.peek();
    23                 char c = s.charAt(i);
    24                 
    25                 if(match(top.c, c)){
    26                     stack.pop();
    27                     if(stack.empty()){
    28                         max = Math.max(max, i- (-1));
    29                     } else{
    30                         max = Math.max(max, i - (stack.peek()).i);
    31                     }
    32                     
    33                 } else {
    34                     stack.push(new Node(c, i));
    35                 }
    36             } else {
    37                 char c = s.charAt(i);
    38                 stack.push(new Node(c, i));
    39             }
    40         }
    41         
    42         return max;
    43     }
    44     
    45     boolean match(char a, char b){
    46         if(a == '(' && b == ')'){
    47             return true;
    48         } else {
    49             return false;
    50         }
    51     }
    52     
    53 }

    参考:http://fisherlei.blogspot.com/2013/03/leetcode-longest-valid-parentheses.html

    http://www.cnblogs.com/remlostime/archive/2012/11/25/2787878.html

    对代码进行重构,'('只会入栈,')'可能入栈,可能出栈

    Version 3

     1 class Node{
     2     char c;
     3     int i;
     4     public Node(char c, int i){
     5         this.c = c;
     6         this.i = i;
     7     }
     8 }
     9 
    10 public class Solution {
    11     public int longestValidParentheses(String s) {
    12         int max = 0;
    13         int len = s.length();
    14         Stack<Node> stack = new Stack<Node>();
    15         stack.push(new Node(')', -1));        
    16         int curLen = 0;
    17         for(int i = 0; i < len; i++){
    18             char c = s.charAt(i);
    19             if(c == '('){
    20                 stack.push(new Node(c, i));
    21             } else {
    22                 Node top = stack.peek();
    23                 if(top.c == '('){
    24                     stack.pop();
    25                     max = Math.max(max, i - stack.peek().i);
    26                 } else {
    27                     stack.push(new Node(c, i));
    28                 }
    29             }
    30         }
    31         return max;
    32     }
    33 }
  • 相关阅读:
    Spring核心思想:IOC(控制反转)、DI(依赖注入)和AOP(面向切面编程)
    synchronized 与 lock锁的异同
    SpringMVC工作流程
    close()和flush()的区别
    MySQL—索引(Index)
    MySQL—事务(ACID)
    MySQL—存储引擎
    周学习笔记(16)——大三下
    周学习笔记(15)——大三下
    周学习笔记(14)——大三下
  • 原文地址:https://www.cnblogs.com/feiling/p/3229800.html
Copyright © 2020-2023  润新知