直面最长有效括号的挑战,轻松算法题的重围!
2023-12-18 08:07:09
输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"。
示例 2:
输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()”。
示例 3:
输入:s = ""
输出:0
提示:
0 <= s.length <= 3 * 104
s[i] 为 '(' 或 ')'
最长有效括号是前端面试中一道经典的算法题,以其挑战性与趣味性备受面试官青睐。
要破解最长有效括号的奥秘,首先需要理解它的定义:
最长有效括号 :指的是一个只包含'('和')'的字符串中,最长的格式正确且连续的括号子串。
举个例子,对于字符串 "(()",最长有效括号是 "()",长度为2。而对于字符串 ")()())",最长有效括号是 "()()",长度为4。
现在,我们一步步深入了解最长有效括号的算法:
-
动态规划 :
最长有效括号的问题可以转化为一个动态规划问题。我们可以定义一个状态数组
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
个字符组成的字符串中,最长有效括号的长度,其中j
是s[i]
匹配的'('所在的索引。 -
算法实现 :
基于动态规划的状态转移方程,我们可以设计一个算法来求解最长有效括号的长度:
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)
通过这个算法,我们可以高效地求解出最长有效括号的长度。
当然,最长有效括号还有多种算法可以求解,比如栈、递归等。但对于面试官来说,更重要的是你对算法的理解和应用能力。
在面试中,你可能还会遇到其他关于括号匹配的算法题。这些算法题往往考察的是你对栈数据结构和递归算法的理解。因此,在准备面试时,除了掌握最长有效括号的算法外,也需要对其他括号匹配算法有一定的了解。
最后,祝愿你在前端面试中取得优异的成绩!