[質問レコードを磨く]32。最も長い有効な括弧

オファーが届きました。友達を掘って受け取りましょう!私は2022年の春の採用チェックインイベントに参加しています。クリックして表示します活動の詳細

1.トピックの説明

ソース:LeetCode

'(' 合計 のみを含む文字列が与えられた ')' 場合、最も長い有効な(整形式で連続した)括弧で囲まれた部分文字列の長さを見つけます。

例1:

输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"
复制代码

例2:

输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"
复制代码

例3:

输入:s = ""
输出:0
复制代码

ヒント:

  • 0 <= s.length <= 3 * 104
  • s[i]は'('または')'です

2.思考分析

前に【質問記録を磨く】20.有効な括弧この質問を使用して、有効な括弧のテストを実装しました。

  • 文字列をトラバースしますsを使用iして現在のトラバーサル位置を記録し、を使用jして最も近い最長の有効なブラケットの開始位置を記録します。

  • 遭遇するたびに(、その添え字をスタックに置きます。

  • 検出されるたびに)、スタックの一番上の要素をポップして、現在の閉じ括弧が一致していることを示します。

  • スタックが空の場合は、現在の閉じ括弧が一致しない閉じ括弧であることを意味し j 、下付き文字を使用して長さを計算します。

  • スタックが空でない場合は、スタックの一番上の要素の添え字を使用して長さを計算します。

3.コードの実装

class Solution {
    public int longestValidParentheses(String s) {
        Deque<Integer> stack = new ArrayDeque<>();
        int res = 0;
        for (int i = 0, j = -1; i < s.length(); i++) {
            if (s.charAt(i) == '(') {
                stack.addLast(i);

            } else {
                if (!stack.isEmpty()) {
                    stack.pollLast();
                    int top = j;
                    if (!stack.isEmpty()) top = stack.peekLast();
                    res = Math.max(res, i - top);
                } else {
                    j = i;
                }
            }
        }
        return res;
    }
}
复制代码

複雑さの分析

  • 時間計算量:  O (( n )。 オン) n文字列の長さ
  • スペースの複雑さ:  O (( n )。 オン) n文字列の長さ

運転結果

image.png

要約する

この質問は、前の質問の拡張版でもあります。主なことは、スタックを使用して括弧の効率的なマッチングを実現することです。

さまざまな問題について、適切なデータ構造を選択して、問題をより迅速に解決します。

続けて~~

おすすめ

転載: juejin.im/post/7079030056151941150