链接
https://leetcode-cn.com/problems/longest-valid-parentheses/
耗时
解题:2 h
题解:33 min
题意
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
思路
用一个与字符串长度相同的标记数组来记录对应位置的括号是否合法,这样问题就转化成了求标记数组中最长的标记为合法的子序列的长度,这是非常容易的。
那么如何判断每个括号是否合法呢?
我的策略:遍历字符串,维护当前可用的 “(” 的数量,当遇到 “)” 并且当前存在可用 “(” 时,则寻找它对应的 “(”,如果能找到,则它们合法。在寻找对应的 “(” 时,维护一个当前已经遍历过的元素中不合法元素的数组,如果最后一个不合法的元素为 “(”,则标记它们 “(***)” 为合法。
时间复杂度: O ( n ) O(n) O(n)
AC代码
class Solution {
public:
int longestValidParentheses(string s) {
int n = s.size();
int l_num = 0;
vector<bool> valid(n, false);
vector<int> invalid_elem;
for(int i = 0; i < n; ++i) {
if(s[i] == '(') {
l_num++;
}
else if(s[i] == ')' && l_num > 0) {
if(!invalid_elem.empty() && s[invalid_elem.back()] == '(') {
valid[invalid_elem.back()] = true;
valid[i] = true;
l_num--;
invalid_elem.pop_back();
}
}
if(valid[i] == false) {
invalid_elem.push_back(i);
}
}
int ans = 0;
int sub_len = 0;
for(int i = 0; i < n; ++i) {
valid[i] == true ? sub_len++ : sub_len = 0;
ans = max(ans, sub_len);
}
return ans;
}
};