力扣解題思路 32 最長有效括號 糾錯記錄

2021-10-24 15:19:45 字數 2130 閱讀 9048

思路:給定乙個只包含 『(』 和 『)』 的字串,找出最長的包含有效括號的子串的長度。

輸入:

"(()"

輸出:2

解釋: 最長有效括號子串為 "()"

輸入:")()())"

輸出:4

解釋: 最長有效括號子串為 "()()"

這一題和22. 括號生成類似,首先想到的是用棧來解決,先看一下我的錯誤**:

int count =0;

stack

stack =

newstack

<

>()

;for

(int i=

0;ilength()

;i++

)else

else}}

return s.

length()

-stack.

size()

-count;

錯就錯在我這個**完全只考慮了()型別的括號的總數,而並沒有管是否是連續最長的,所以是有問題的。於是我做了相應修改,在迴圈中不斷維護最大長度,每次的最大長度只需與棧頂元素(索引)相比較即可。那麼又會出現乙個問題,當s.charat(i) == ')'時我們stack.pop()後再取stack.peek()時可能報空棧異常這個錯,為了避免空棧帶來的問題,我們最開始需要給棧中新增乙個元素-1(不會對長度計算造成影響,相當於0前面乙個數)。

可以看注釋,注釋中寫的很清楚:

int maxans =0;

stack

stack =

newstack

<

>()

;stack.

push(-

1);for

(int i =

0; i < s.

length()

; i++

)else

else}}

return maxans;

第二次寫,我的方法是這樣:

public

intlongestvalidparentheses

(string s)

else

else}}

return maxans;

}

遇到「)」找棧頂有沒有「(」,若沒有則壓棧,若有則出棧並且將當前索引與棧頂索引做差,即為中間連續有小括號長度,我覺得比上一種方法更容易理解,但是要注意 maxans = stack.isempty()? math.max(maxans, i + 1):math.max(maxans, i - stack.peek());這句中,如果棧為空了就相當於棧中有乙個-1,所以這裡是 math.max(maxans, i - (-1)) !!

另外乙個方法是動態規劃,這個動態規劃的方程就比較複雜了,我認為比較難想到。dp[i]表示到i為止的最長有效括號(一定是以i位結尾的括號),dp[i]顯然是與dp[i-1]有關的,那麼要建立關係我們就要追溯到dp[i-1]的這個最長有效括號串的前乙個括號,也就是i - dp[i - 1] - 1,如果該位置是』)『就不用管了,因為湊不成(),如果該位是』('就要更新dp[i]了,dp[i]就等於dp[i-1]的長度加上dp[i-1]前後的兩個(),如果dp[i-1]前的』('前還有數,也要加上該串即dp[leftindex - 1],所以更新方程如下:

dp[i]

= dp[i -1]

+(leftindex -

1>=

0? dp[leftindex -1]

:0)+

2;

要注意的是,我們最終的結果不是dp[s.length()],因為最長有效括號不一定是以最後一位結尾的,所以最終結果應該是所有dp[i]中的最大值。完整**如下:

public

intlongestvalidparentheses

(string s)

}return res;

}

力扣32 最長有效括號

32.最長有效括號 給定乙個只包含 和 的字串,找出最長的包含有效括號的子串的長度。示例 1 輸入 輸出 2 解釋 最長有效括號子串為 示例 2 輸入 輸出 4 解釋 最長有效括號子串為 這是道困難題,看到了括號,我第一想到的就是棧,因為對於匹配括號的題,棧這種資料結構是非常好用的。其次最長有效,這...

力扣刷題 32 最長有效括號

給定乙個只包含 和 的字串,找出最長的包含有效括號的子串的長度。動態規劃初步 動態規劃可以理解為是一種遞迴的思想,當前的狀態可以由之前已知的狀態推導過來 用數學表示即 f x 可以由f x 1 或者f x 2 的某種關係得到。一般來講,目標是求什麼則什麼即為狀態,然後分析當前狀態和之前狀態的推導關係...

力扣 32 最長有效括號 思維 棧

思路一 初始置cur ct 0cur ct 0 cur ct 0,如果遇到 就令cur ctcur ct cur ct 自增,否則令cur curcu r自減,ctct ct自增,那麼當cur 0cur 0 cur 0時說明當前子串匹配了,我們可以令ans max ans ct ans max an...