
(关注数据结构和算法,了解更多新知识)
刷题的时候在评论区看到有这样一条留言,一网友在拼多多笔试面试的时候遇到过这道题,由于之前没做过,结果没写出来,最后直接挂了。而这题就是LeetCode的第32题:最长有效括号。

这题除了拼多多考过以外,网易,字节,华为,腾讯等大厂都考过,我们来看下这究竟是一道什么样的题,竟如此受这么多大厂的青睐。

问题描述
来源:LeetCode第32题
难度:困难
给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例1:
输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"
示例2:
输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"
0 <= s.length <= 3 * 10^4
s[i] 为 '(' 或 ')'
问题分析
对于括号的匹配问题,我们最容易想到的就是使用栈stk,在开始的时候我们需要添加一个标志位,这个标志位表示当前位置及之前的字符不能再和后面的匹配了。
在最开的时候我们添加标志位为 -1 ,比如前面 4 个字符如果都是有效的括号,那么第 4 个字符的下标是 3(下标是从 0 开始的),让他减去标志位的值正好等于 4 。
然后我们遍历字符串中的所有字符,如果遇到左括号我们就把它的下标 i 压入到栈中。
如果遇到右括号,栈顶元素出栈,出栈之后如果栈不为空,那么当前右括号和出栈的括号是匹配的,以当前右括号为最右边的有效括号长度就是 i - stk.peek() ,我们计算并保存最大值即可。
出栈之后如果栈为空,当前右括号是没法匹配的,我们把他的下标 i 压入到栈中,他就变成了标志位,我们画个图看下。

JAVA:
public int longestValidParentheses(String s) {
int max = 0;// 记录最大长度
Stack<Integer> stack = new Stack<>();// 栈
stack.push(-1);// 先把-1压栈
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == '(') {
stack.push(i);// 遇到左括号,下标压栈
} else {
stack.pop();// 遇到右括号,栈顶元素先出栈。
if (stack.empty()) {// 如果栈为空,把这个右括号的下标压栈。
stack.push(i);
} else {// 计算长度,保存最大值。
max = Math.max(max, i - stack.peek());
}
}
}
return max;
}
C++:
public:
int longestValidParentheses(string s) {
int ans = 0;// 记录最大长度
stack<int> stk;// 栈
stk.push(-1);// 先把-1压栈
for (int i = 0; i < s.length(); i++) {
if (s[i] == '(') {
stk.push(i);// 遇到左括号,下标压栈
} else {
stk.pop();// 遇到右括号,栈顶元素先出栈。
if (stk.empty()) {// 如果栈为空,把这个右括号的下标压栈。
stk.push(i);
} else {// 计算长度,保存最大值。
ans = max(ans, i - stk.top());
}
}
}
return ans;
}
C:
int longestValidParentheses(char *s) {
int ans = 0;// 记录最大长度
int *stk = malloc(30000 * sizeof(int));// 栈
int index = 0;
stk[index++] = -1;// 先把-1压栈
for (int i = 0; i < strlen(s); i++) {
if (s[i] == '(') {
stk[index++] = i;// 遇到左括号,下标压栈
} else {
index--;// 遇到右括号,栈顶元素先出栈。
if (index == 0) {// 如果栈为空,把这个右括号的下标压栈。
stk[index++] = i;
} else {// 计算长度,保存最大值。
ans = fmax(ans, i - stk[index - 1]);
}
}
}
return ans;
}
Python:
def longestValidParentheses(self, s: str) -> int:
ans = 0 # 记录最大长度
stk = [-1] # 先把 -1 压栈
for i, ch in enumerate(s):
if ch == '(':
stk.append(i) # 遇到左括号,下标压栈
else:
stk.pop() # 遇到右括号,栈顶元素先出栈。
if not stk: # 如果栈为空,把这个右括号的下标压栈。
stk.append(i)
else: # 计算长度,保存最大值。
ans = max(ans, i - stk[-1])
return ans

笔者简介
博哥,真名:王一博,毕业十多年,《算法秘籍》作者,专注于数据结构和算法的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解800多题,对算法题有自己独特的解题思路和解题技巧,喜欢的可以给个关注,也可以下载我整理的1000多页的PDF算法文档。
1952

被折叠的 条评论
为什么被折叠?



