leetcode

来源:互联网 发布:河南用友软件总代理 编辑:程序博客网 时间:2024/05/30 22:45

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.

Solution1:

  public int longestValidParentheses(String s) {    if (s == null || s.length() < 2) {      return 0;    }    int longest = 0;    char[] chars = s.toCharArray();    LinkedList<Integer> stack = new LinkedList<>();    for (int i = 0; i < chars.length; i++) {      if (chars[i] == '(') {        stack.push(i);      } else {        if (stack.isEmpty()) {          stack.push(i);        } else {          if (chars[stack.peek()] == '(') {            stack.pop();          } else {            stack.push(i);          }        }      }    }    if (stack.isEmpty()) {      longest = s.length();    } else {      int begin = 0;      int end = s.length();      while (!stack.isEmpty()) {        begin = stack.pop();        longest = Math.max(longest, end - begin - 1);        end = begin;      }      longest = Math.max(longest, end - 0);    }    return longest;  }

Solution2:

  public int longestValidParentheses(String s) {    if (s == null || s.length() < 2) {      return 0;    }    int longest = 0;    int left = -1;    char[] chars = s.toCharArray();    LinkedList<Integer> stack = new LinkedList<>();    for (int i = 0; i < chars.length; i++) {      if (chars[i] == '(') {        stack.push(i);      } else {        if (stack.isEmpty()) {          left = i;        } else {          stack.pop();          if (stack.isEmpty()) {            longest = Math.max(longest, i - left);          } else {            longest = Math.max(longest, i - stack.peek());          }        }      }    }    return longest;  }

Solution3:

better

  public int longestValidParentheses(String s) {    int longest = 0;    LinkedList<Integer> stack = new LinkedList<>();    stack.push(-1);    for (int i = 0; i < s.length(); i++) {      if (s.charAt(i) == '(') {        stack.push(i);      } else {        stack.pop();        if (stack.isEmpty()) {          stack.push(i);        } else {          longest = Math.max(longest, i - stack.peek());        }      }    }    return longest;  }
0 0
原创粉丝点击