這道題目看似可以使用棧來做,實則用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 的某種關係得到。一般來講,目標是求什麼則什麼即為狀態,然後分析當前狀態和之前狀態的推導關係...