返回

直面最长有效括号的挑战,轻松算法题的重围!

前端

输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"。
示例 2:
输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()”。
示例 3:
输入:s = ""
输出:0
提示:
0 <= s.length <= 3 * 104
s[i] 为 '(' 或 ')'

最长有效括号是前端面试中一道经典的算法题,以其挑战性与趣味性备受面试官青睐。

要破解最长有效括号的奥秘,首先需要理解它的定义:

最长有效括号 :指的是一个只包含'('和')'的字符串中,最长的格式正确且连续的括号子串。

举个例子,对于字符串 "(()",最长有效括号是 "()",长度为2。而对于字符串 ")()())",最长有效括号是 "()()",长度为4。

现在,我们一步步深入了解最长有效括号的算法:

  1. 动态规划

    最长有效括号的问题可以转化为一个动态规划问题。我们可以定义一个状态数组dp[i],其中dp[i]表示字符串s的前i个字符组成的字符串中,最长有效括号的长度。

    状态转移方程为:

    dp[i] = dp[i - 1] + 2, 
    if s[i] == ')' and s[i - 1] == '('
    
    dp[i] = max(dp[i - 1], dp[j]), 
    if s[i] == ')' and s[j] == '(' and j < i - 1
    

    其中,dp[i - 1]表示字符串s的前i - 1个字符组成的字符串中,最长有效括号的长度。

    dp[j]表示字符串s的前j个字符组成的字符串中,最长有效括号的长度,其中js[i]匹配的'('所在的索引。

  2. 算法实现

    基于动态规划的状态转移方程,我们可以设计一个算法来求解最长有效括号的长度:

    def longest_valid_parentheses(s):
        n = len(s)
        dp = [0] * n
    
        for i in range(1, n):
            if s[i] == ')':
                if s[i - 1] == '(':
                    dp[i] = dp[i - 2] + 2
                elif i - dp[i - 1] > 0 and s[i - dp[i - 1] - 1] == '(':
                    dp[i] = dp[i - 1] + dp[i - dp[i - 1] - 2] + 2
    
        return max(dp)
    

通过这个算法,我们可以高效地求解出最长有效括号的长度。

当然,最长有效括号还有多种算法可以求解,比如栈、递归等。但对于面试官来说,更重要的是你对算法的理解和应用能力。

在面试中,你可能还会遇到其他关于括号匹配的算法题。这些算法题往往考察的是你对栈数据结构和递归算法的理解。因此,在准备面试时,除了掌握最长有效括号的算法外,也需要对其他括号匹配算法有一定的了解。

最后,祝愿你在前端面试中取得优异的成绩!