题目简介:
给定一个只包含 '('
和 ')'
的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
1 | 输入: "(()" |
示例 2:
1 | 输入: ")()())" |
思路:
利用动态规划的思想,dp[i]
代表以s[i]
为结尾的字符串的有效括号长度。
所以以(
为结尾的是不会有有效括号长度的,dp[i] = 0
。
以)
为结尾的有两种情况
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 - 1]
即前一个字符的有效长度,s[i - dp[i - 1] - 1]
即是与s[i]
相匹配的括号。- 若能匹配上,
dp[i] = dp[i - 1] + dp[i - dp[i - 1] - 2] + 2
,即前一个字符的有效长度加上与s[i - dp[i - 1] - 2]
字符为结尾的有效长度(之前子串的有效长度)再加上2。
循环时存储长度的最大值,最后返回即可。
tip:
- 需要注意边界问题,防止数组溢出。
代码如下:
1 | class Solution { |