日常刷題 最長括號匹配DP

2021-08-29 05:24:05 字數 1020 閱讀 9323

這道題目看似可以使用棧來做,實則用dp可以更加簡單。

我們設f[i

]f[i]

f[i]

為以第i位結尾的可以匹配的最大長度。

對於每乙個第i

ii位,如果需要存在合法序列必須滿足兩個條件

1.是左括號

2.必須和其有邊的字元組成乙個序列

事實上對於第乙個條件我們只要簡單的判斷,而對於第二個條件就和我們的決策有關。

而對於轉移方程f[i],只要當前的這個字元s[i

]s[i]

s[i]

和以i +1

i+1i+

1位起點構成串的有邊匹配,就說明能夠成立乙個合法的串。如果列出轉移方程,就是:

f [i

]=f[

i+1]

+2,(

s[i]

屬於左括

號,s[

i]=s

[i+f

[i]+

1]

)f[i]=f[i+1]+2,(s[i]屬於左括號, s[i]=s[i+f[i]+1])

f[i]=f

[i+1

]+2,

(s[i

]屬於左

括號,s

[i]=

s[i+

f[i]

+1])

對於條件3,我們只要繼續累加f[i

+f[i

]]

f[i+f[i]]

f[i+f[

i]]即可。

#include

using

namespace std;

#define maxn 2000000

int max=

0,st=

0,f[maxn]

;char s[maxn];;

intmain()

}for

(int i=

0;i) cout<;return0;

}

最長括號匹配長度

問題 假如給你乙個由 和 組成的乙個隨機的括號序列,當然,這個括號序列肯定不能保證是左右括號匹配的,所以給你的任務便是去掉其中的一些括號,使得剩下的括號序列能夠左右括號匹配且長度最長,即最長的合法括號序列。輸入 測試資料報括多個,每個測試資料只有一行,即乙個隨機的括號序列,該括號序列的長度保證不超過...

力扣刷題之路 括號匹配問題

括號匹配問題在力扣中有好幾道,簡單的括號匹配問題即乙個左括號需要對應乙個右括號,判斷是否匹配或者需要加入幾個左括號或右括號,此時的問題比較簡單,當字串中的字元只有一種型別的括號時,直接用乙個變數儲存需要的左括號或者右括號數量即可,當有多種括號型別時,可以利用棧儲存字串陣列中的字元,根據棧後進先出的特...

力扣刷題 32 最長有效括號

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