LeetCode刷题-32.最长有效括号
题目链接:32.最长有效括号
¶题解:
又是动态规划的题,需要多加理解与按步骤走;同时使用栈也可以巧妙的解决!
¶题目简述:
给定一个包含左右括号的字符串,需要求出最长的有效匹配括号的子串的长度!
¶题解一:使用栈
首先,先回忆一下括号匹配的两个条件?
- 左右括号相等
- 任意前缀左括号数量大于等于右括号数量
接下来,我们可以将该括号序列分为若干段:
- 从前向后找,找到右括号大于左括号的位置,此时就是一段合法区间
- 从所有合法区间中找到一个最大匹配有效长度即可
参考下面的图:

具体操作:
使用start标记可匹配区间的上一个元素,即每次出现的右大于左的位置!
- 遇到左括号直接进栈
- 遇到右括号:
- 若栈不空,说明没走到右大于左的位置,此时栈顶元素与之对应的左括号出栈
- 如果出栈后栈空,说明从起点
start到当前位置i是一组有效括号序列,更新最大值 - 如果出栈后不空,说明栈顶到当前位置
i是一组有效括号序列,更新最大值
- 如果出栈后栈空,说明从起点
- 若栈为空,说明已经走到右大于左的位置,此时更新
start为当前位置i
- 若栈不空,说明没走到右大于左的位置,此时栈顶元素与之对应的左括号出栈
¶AC代码一:
1 | |
¶题解二:动态规划
题目中提到了最长,可以考虑使用动态规划解题!
同样分为两步:
- 状态表示:一个字符串,使用一维数组
dp[i],表示以s[i]为结尾的字符串中有效括号的最大长度(包括i) - 状态计算:
- 若
s[i]为左括号,由于左括号不可能和之前括号组合为有效括号,故dp[i] = 0 - 若
s[i]为右括号:- 若
s[i - 1]为左括号,形如:...(),此时dp[i] = 2;若相邻的之前还有匹配括号,则dp[i] += dp[i - 2],见下方图一! - 若
s[i - 1]为右括号,形如:...)),则此时只有保证当前右括号有匹配项,即dp[i - 1] > 0,形如:...(...));并且保证s[i]也有括号匹配,即s[i - dp[i - 1] - 1] == '(',形如:...((...)),这样才可完成s[i]的匹配,此时dp[i] = dp[i - 1] + 2;若与s[i]匹配的左括号相邻的之前还有匹配括号,形如:.(..)((...)),则dp[i] += dp[i -dp[i - 1] - 2],见下方图二!
- 若
- 若
图一:

图二:

¶AC代码二:
1 | |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小牛博客!
评论




