1. 程式人生 > >【LeetCode】32. Longest Valid Parentheses - Java實現

【LeetCode】32. Longest Valid Parentheses - Java實現

文章目錄

1. 題目描述:

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 “()()”

2. 思路分析:

題目的意思是給定一個括號序列的字串,找到最長有效括號子序列的長度。

此題可用棧來實現,建立一個棧用來存放字元在字串中的位置,遍歷整個字串,如果遇到左括號,則當前位置入棧;如果遇到右括號,則彈出棧頂元素,此時分2種情況討論:
(1)如果此時棧不為空,則表示此次成功匹配,這時匹配的長度為當前位置減去棧頂元素值;
(2)如果此時為空,則表示彈出的並非左括號,而是起始位置標識值,則表示此次匹配失敗,則需要當前位置入棧表示下次匹配的起始值。

3. Java程式碼:

原始碼見我GiHub主頁

程式碼:

public static int longestValidParentheses(String s) {
    Stack<Integer> stack = new Stack<>();
    // 為了方便計算push一個匹配開始位置的前一個位置
    stack.push(-1);
    int maxLen = 0;
    for (int i = 0; i < s.length(); i++) {
        if (s.charAt(i) == '(') {
            stack.
push(i); } else { stack.pop(); if (stack.isEmpty()) { // 表示未匹配,重新push下一次匹配開始位置的前一個位置 stack.push(i); } else { // i-stack.peek()表示當前匹配的長度 maxLen = Math.max(maxLen, i - stack.peek()); } } } return maxLen; }