1. 题目解析与核心思路
最长有效括号问题是一个经典的字符串处理题目,要求我们找到给定字符串中最长的连续有效括号子串的长度。有效括号的定义是每个左括号都能找到对应的右括号闭合,并且这些括号是连续排列的。
1.1 问题难点分析
这个问题的难点主要体现在以下几个方面:
-
连续性要求:我们需要找到的是连续的有效括号子串,而不是分散的有效括号对。例如在字符串"()(()"中,虽然有两个有效的"()"对,但它们不是连续的,所以最长有效长度是2而不是4。
-
嵌套结构处理:有效括号可能包含多层嵌套,如"(()())"这样的结构,简单的计数器无法处理这种嵌套关系。
-
边界条件:需要考虑空字符串、全左括号、全右括号等各种边界情况。
1.2 解法概览
针对这个问题,我们主要讨论三种解法:
-
动态规划解法:通过定义状态数组dp[i]表示以i结尾的最长有效括号长度,利用之前的状态推导当前状态。
-
栈解法:利用栈结构来匹配括号对,同时记录索引来计算有效长度。
-
正反向计数法:通过两次遍历(从左到右和从右到左)统计括号数量,找到有效区间。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 动态规划解法详解
动态规划是解决这类字符串匹配问题的有效方法,下面我们详细解析这种解法的实现思路。
2.1 状态定义
我们定义dp[i]表示以第i个字符结尾的最长有效括号子串的长度。根据有效括号的定义,只有以右括号')'结尾的子串才可能是有效的,所以对于左括号'(',dp[i]始终为0。
2.2 状态转移方程
对于当前字符s[i]为')'的情况,我们需要考虑两种子情况:
2.2.1 情况一:前一个字符是'('
即形如"...()"的结构。这种情况下,当前这对括号可以直接形成一个有效对,因此:
code复制dp[i] = dp[i-2] + 2
这里dp[i-2]表示这对括号之前可能存在的有效长度。
2.2.2 情况二:前一个字符是')'
即形如"...))"的结构。这种情况下,我们需要检查是否能形成一个更大的有效块。具体步骤:
- 计算前一个有效块的起始位置:
beforePrevIndex = i - dp[i-1] - 1 - 如果这个位置的字符是'(',则说明可以形成更大的有效块:
code复制这里包含三部分:内部块长度、新增的外层括号长度、以及前面可能连接的其他有效块长度。dp[i] = dp[i-1] + 2 + dp[beforePrevIndex - 1]
2.3 代码实现与注释
java复制class Solution {
public int longestValidParentheses(String s) {
if (
