给你一个只包含
'('
和')'
的字符串,找出最长有效(格式正确且连续)括号子串
的长度。
示例 1:
输入:s = "(()" 输出:2 解释:最长有效括号子串是 "()"示例 2:
输入:s = ")()())" 输出:4 解释:最长有效括号子串是 "()()"示例 3:
输入:s = "" 输出:0提示:
0 <= s.length <= 3 * 104
s[i]
为'('
或')'
我一开始没想到dp
直接设置一个栈,弹出的部分一定符合要求。记录弹出的下标,然后找出最长连续下标即可。
按说也是O(n)时间复杂度,不过13ms打败5%
class Solution {
public:
int longestValidParentheses(string s) {
vector<int> str_idx;
set<int> idice;
int cur = 1, res = 0, pre;
for (int i = 0; i < s.length(); i++) {
if (s[i] == '(') {
str_idx.push_back(i);
}
if (str_idx.size() != 0 && s[i] == ')') {
idice.insert(*str_idx.rbegin());
idice.insert(i);
str_idx.pop_back();
}
}
for (auto i = idice.begin(); i != idice.end(); i++) {
if (i == idice.begin()) pre = *i;
else {
if (*i == pre + 1) cur++;
else {
res = cur > res ? cur : res;
cur = 1;
}
pre = *i;
}
}
res = cur > res ? cur : res;
if (res == 1)return 0;
return res;
}
};