iT邦幫忙

2025 iThome 鐵人賽

DAY 0
0
自我挑戰組

LeetCode 每日一題挑戰系列 第 25

Day 25 — Longest Valid Parentheses

  • 分享至 

  • xImage
  •  

題目

給定一個只包含 '(' 和 ')' 的字串,返回其中 最長的有效括號子串長度。

範例

Input: "(()"
Output: 2
Explanation: 最長有效括號為 "()"。

Input: ")()())"
Output: 4
Explanation: 最長有效括號為 "()()"。

Input: ""
Output: 0

解題思路

這題可以用 動態規劃 (DP) 或 Stack 來解。
這裡用 Stack 方法解釋,邏輯如下:

初始化 Stack,並放入 -1 作為基準。

遍歷字串:

遇到 '(',把當前索引推入 Stack。

遇到 ')',彈出 Stack 頂部元素。

如果 Stack 空了,將當前索引放入 Stack。

否則用當前索引減去 Stack 頂部索引,更新最大長度。

最終的最大長度即為答案。

時間複雜度:O(n),空間複雜度:O(n)。

Java 實作
import java.util.*;

class Solution {
public int longestValidParentheses(String s) {
Stack stack = new Stack<>();
stack.push(-1); // 基準索引
int maxLen = 0;

    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);

        if (c == '(') {
            stack.push(i);
        } else {
            stack.pop();

            if (stack.isEmpty()) {
                stack.push(i);
            } else {
                maxLen = Math.max(maxLen, i - stack.peek());
            }
        }
    }

    return maxLen;
}

}

心得

這題的核心是理解如何使用 Stack 來追蹤未匹配的括號位置,利用索引差來算出有效括號長度。
雖然一開始有點抽象,但實作後會覺得非常直覺。
這個技巧也能延伸到括號匹配、語法檢查等實務場景,算是一個很實用的技能。https://ithelp.ithome.com.tw/upload/images/20250926/20169537oefieK5rvf.pnghttps://ithelp.ithome.com.tw/upload/images/20250926/20169537bZTmKIccCB.pnghttps://ithelp.ithome.com.tw/upload/images/20250926/20169537Nba56yzBwP.pnghttps://ithelp.ithome.com.tw/upload/images/20250926/20169537WaJxsAyQsw.png


上一篇
Day 24 — Next Permutation
系列文
LeetCode 每日一題挑戰25
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言