LeetCode32-最长有效括号
32. 最长有效括号
给你一个只包含 '('
和 ')'
的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = “(()”
输出:2
解释:最长有效括号子串是 “()”
示例 2:
输入:s = “)()())”
输出:4
解释:最长有效括号子串是 “()()”
感觉动态规划的题,核心就是找到状态转移的方差,一个是定义dp[i],一个是如何根据之前的结果推理出dp[i]的表达式。
对于数组的题目,dp[i]的定义很多都是以i结尾的最优解是啥,然后再推理dp[i]的表达式。
对于这题,我们定义dp[i]表示以i结尾的最长有效括号的子串长度。
根据题意,我们假设:
-
当
s[i] = '('
时,dp[i]必然等于0,因此不必讨论。 -
当
s[i] = ')'
时:- 如果
s[i-1] = '('
,那么s[i]就必定和s[i - 1]配对,那么很容易得出这种情况的表达式:dp[i] = dp[i - 2] + 2
- 如果
s[i-1] = ')'
,dp[i-1]表示以s[i - 1]结尾的最长有效括号子串,那么s[i]有可能和s[i - dp[i - 1] - 1]
这个字符匹配,即如果s[i - dp[i - 1] - 1]
为(
,那么可以得到dp[i] = dp[i - 1] + 2 + dp[i - dp[i - 1] - 2]
- 如果
1 | class Solution { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Lucky Le の Blog!
评论