给定一个只包含 '('
和 ')'
的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
示例 2:
输入: ")()())
" 输出: 4 解释: 最长有效括号子串为"()()"
思路:
开辟一个与输入string等长新的数组match,初始化为0;
开辟一个栈,用来匹配有效括号。
若匹配成功,则把match数组中与匹配成功的括号位置的数变为count,count表示这是第几对匹配成功的括号。
匹配完成后,遍历match数组,找出不含0的最长子集长度。
举例:
输入string s = “()(()”
初始化match[5] = {0,0,0,0,0};
然后进行括号匹配,一共两对匹配括号,故更新后的match数组为{1,1,0,2,2}
最长子串长度为2,故最终结果为2.
class Solution {
public:
int longestValidParentheses(string s) {
stack<char> list;
int len = 0;
int count = 1;
vector<int> index;
vector<int> match;
if(s.length() == 0)
return 0;
list.push(s[0]);
index.push_back(0);
for(int i = 0; i < s.length(); i++)
{
match.push_back(0);
}
for(int i = 1; i < s.length(); i++)
{
if(!list.empty())
if(isMatch(list.top(), s[i]))
{
list.pop();
match[i] = count;
match[index.back()] = count;
count++;
index.pop_back();
}
else
{
list.push(s[i]);
index.push_back(i);
}
else
{
list.push(s[i]);
index.push_back(i);
}
}
len = result(match);
return len;
}
int result(vector<int> vec){
int len = vec.size();
int max = 0;
int cur = 0;
for(int i = 0; i < len; i++)
{
if(vec[i] == 0)
{
max = max> cur? max:cur;
cur = 0;
}
else
cur++;
}
max = max> cur? max:cur;
return max;
}
bool isMatch(char s1, char s2){
if(s1 == '(' && s2 == ')')
return true;
else
return false;
}
};