32. 最长有效括号
给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”
思路
主要还是应用一个栈的先进先出的效果来做,这样可以很容易找到正确的括号;但是题目要求的是这个字符串里最长的正确括号数量,这里用了一个vector来扫描整个字符串找出其中正确的括号和分割点(-1,3时分割点),另一个vector来记录正确的括号和分割点。只要碰到’(‘都压入resV末尾,num用-1记录这是一个‘(’;当碰到‘)’时,若resV为空,说明这是个错误的括号,它有可能在字符开头也有可能是两个正确括号串的分割点,resV中不做记录,num中压入3值作为分割点;当resV非空时,说明这是个正确的括号,因为resV中只会记录‘(’,必然正确。而此时num中可能时[-1],或者[-1,2]这种情况,所以需要找到最靠近的一个-1值,将3加上去,这样那个-1值变成2就不再是一个分割点了。
最后再扫描num,以-1,3作为分割点,找出最大的连续2值的和输出就行。
执行用时:8 ms
class Solution {
public:
int longestValidParentheses(string s) {
vector<char> resV;
int cnt = 0, max = 0;
vector<int> num;
for (char ch : s) {
if (ch == '(') {
resV.push_back(ch);
num.push_back(-1);
}
if (ch==')') {
if (resV.size() == 0) {
num.push_back(3);
continue;
}
if (resV[resV.size()-1]=='(') {
resV.pop_back();
int s1 = num.size() - 1;
while (num[s1]!=-1) {
s1 -= 1;
}
num[s1] += 3;
}
}
}
int index = 0;
int tp_max = 0;
while(index<num.size()){
if (num[index] != -1 && num[index] != 3) {
tp_max += num[index];
if(index==num.size()-1){
if (tp_max > max) {
max = tp_max;
}
}
}
else {
if (tp_max > max) {
max = tp_max;
}
tp_max = 0;
}
index++;
}
return max;
}
};