LeetCode短視頻 | 最長有效括號使用棧很容易解決,但偏用動態規劃

  • 2019 年 12 月 23 日
  • 筆記

題目如下:

看了這個題目的標籤,動態規劃是其的標籤之一。這題目我第一反應可以使用棧來解決,但我們偏用動態規劃看看解決的是什麼樣子的。

我們定義一個dp[i]數組,其中i表示字符串的下標,值是目前有效的子字符串。

我們將dp數組全部初始化為0。

現在,很明顯有效的子字符串一定以『)』結尾。

我們可以進一步得出結論:以『(』的子字符串對應位置上的值必定為0。

所以說我們只需要更新『)』在dp數組中對應位置的值。

為了求出dp數組,我們每兩個字符檢查一次,如果滿足如下條件

s[i]=『)』且s[i−1]=『(』,形如『『…()…",可以推出:dp[i]=dp[i−2]+2

可以進行這樣的轉移,是因為結束部分的"()"是一個有效子字符串,並且將之前有效子字符串的長度增加了2。

s[i]=『)』且s[i−1]=『)』,也就是字符串形如『『…))…",我們可以推出:

如果s[i−dp[i−1]−1]=『(』,則dp[i]=dp[i−1]+dp[i−dp[i−1]−2]+2

這背後的原因是如果倒數第二個『)』是一個有效子字符串的一部分(記為s),對於最後一個『)』,如果它是一個更長子字符串的一部分,那麼它一定有一個對應的『(』,它的位置在倒數第二個『)』所在的有效子字符串(s)的前面。

因此,如果子字符串s的前面恰好是『(』,那麼我們就用2加上s的長度(dp[i−1])去更新dp[i]。

除此以外,我們也會把有效子字符串『『(,s,)"之前的有效子字符串的長度也加上,dp[i−dp[i−1]−2]。

Java代碼:

——END——