想了好久一直想用动态规划,还是没规划出来,扫了一眼别人的解法,思路顿开。就是多了另一个栈来存放无法匹配的括号位置,然后找相邻的位置最远的即可,因为要遍历栈所以用了容器。
int longestValidParentheses(string s) {
vector<char> stkbracket;
vector<int> stkindex;
int maxsum=0;
int cursum=0;
stkindex.push_back(-1);
for (int i=0;i<s.length();i++)
{
if(s[i]!='('&&s[i]!=')')
return -1;
if (s[i]=='(')
{
stkbracket.push_back(s[i]);
stkindex.push_back(i);
}
else
{
if (!stkbracket.empty()&&stkbracket[stkbracket.size()-1]=='(')
{
stkbracket.pop_back();
stkindex.pop_back();
cursum++;
if (cursum>maxsum)
maxsum = cursum;
}
else
{
stkbracket.push_back(s[i]);
stkindex.push_back(i);
}
}
}
if (stkbracket.empty())
{
maxsum *= 2;
}
else
{
stkindex.push_back(s.length());
maxsum = 0;
for (int i=1;i<stkindex.size();i++)
{
cursum = stkindex[i] - stkindex[i-1] - 1;
if (cursum>maxsum)
{
maxsum = cursum;
}
}
}
return maxsum;
}