思路:給定乙個只包含 『(』 和 『)』 的字串,找出最長的包含有效括號的子串的長度。
輸入:
"(()"
輸出: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...