Leetcode 32 Longest Valid Parentheses

HowieLee59發表於2018-10-29

Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.

Example 1:

Input: "(()"
Output: 2
Explanation: The longest valid parentheses substring is "()"Example 2:
Input: ")()())"
Output: 4
Explanation: The longest valid parentheses substring is "()()"

這個題的意思是求出字串中存在的括號對並進行返回。

1)

class Solution {
    public int longestValidParentheses(String s) {
        int max = 0;
        Stack<Integer> stack = new Stack<>();
        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{
                    max = Math.max(max,i - stack.peek());//計算最大量
                }
            }
        }
        return max;
    }
}

2)

public class Solution {
    public int longestValidParentheses(String s) {
        int left = 0, right = 0, maxlength = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '(') {
                left++;
            } else {
                right++;
            }
            if (left == right) {
                maxlength = Math.max(maxlength, 2 * right);
            } else if (right >= left) {
                left = right = 0;
            }
        }
        left = right = 0;
        for (int i = s.length() - 1; i >= 0; i--) {
            if (s.charAt(i) == '(') {
                left++;
            } else {
                right++;
            }
            if (left == right) {
                maxlength = Math.max(maxlength, 2 * left);
            } else if (left >= right) {
                left = right = 0;
            }
        }
        return maxlength;
    }
}

從左到右和從右向左進行掃。

相關文章