Leetcode- 最长的括号子串(经典题变形)
题目链接
描述
给出一个长度为 n 的,仅包含字符 '(' 和 ')' 的字符串,计算最长的格式正确的括号子串的长度。
例1: 对于字符串 "(()" 来说,最长的格式正确的子串是 "()" ,长度为 2 .
例2:对于字符串 ")()())" , 来说, 最长的格式正确的子串是 "()()" ,长度为 4 .
思路
是经典题判断括号是否匹配的扩展。
可以用 栈 ,也可以用 贪心思想。
- 贪心:
从前遍历 s ,记录一个最后不匹配的位置tmp, 初始为-1.
L,R 分别记录‘(’ 和 ')' 出先的次数。
当 R>L 时,一定时不匹配了,更新tmp为i,L=0,R=0.
当 L == R 时,一定匹配了,ans = max(ans, i-tmp).
只这样不行,像"(()"这种无法正确计算,所以要从后再遍历一遍。
从后遍历 s ,记录一个最后不匹配的位置tmp, 初始为n.
L,R 分别记录‘(’ 和 ')' 出先的次数。
当 L>R 时,一定时不匹配了,更新tmp为i,L=0,R=0.
当 L == R 时,一定匹配了,ans = max(ans, tmp-i). - 栈:
代码一(贪心):
class Solution {
public:
int longestValidParentheses(string s) {
int n = s.size();
int ans = 0;
int tmp = -1, L = 0, R = 0;
for (int i = 0; i < n; i++)
{
if (s[i]=='(') L++;
else if (s[i]==')') R++;
if (R > L) {
L = 0, R = 0;
tmp = i;
} else if (R == L)
ans = max(ans, i-tmp);
}
tmp = n, L = R = 0;;
for (int i = n-1; i >= 0; i--)
{
if (s[i]=='(') L++;
else if (s[i]==')') R++;
if (L > R) {
L = 0, R = 0;
tmp = i;
} else if (R == L)
ans = max(ans, tmp-i);
}
return ans;
}
};
代码二(栈):