这道题可以借用前面的括号匹配的思路,使用栈来解决。这次,我们压入栈的不再是‘(’或者‘)’,而是它的索引值。
大致思路如下:
遍历字符串s,当当前字符是‘(’,则压入栈中;若是‘)’,则判断栈顶是否为‘(’,若是则将栈顶的‘(’弹出,若不是则压入栈中。最后栈中剩下的数字就是不能匹配的‘(’和‘)’的索引值。
例如:”)()())()()(”
最后栈中剩余值为“0 5 10”
说明0~5之间的4个字符成功匹配,5~10之间的4个自付成功匹配。
由此可见,计算两个索引值之间的间距即为匹配成功的字符串长度,我们可以计算出所有的长度,并返回最长的那个,即为最终结果。
代码实现如下:
class Solution {
public:
int longestValidParentheses(string s) {
if (s.empty()||s.size()==1)return 0;
vector<int> res;
for (int i = 0; i < s.size(); i++)
{
if (s[i] == '('){
res.push_back(i);
cout << res.back() << endl;
}
else
{
if (res.empty())
{
res.push_back(i);
}
else{
if (s[res.back()] == '(')
{
res.pop_back();
}
else
{
res.push_back(i);
}
}
}
}
if (res.empty())return s.size();
int result=res[0];
for (int i = 1; i < res.size(); i++)
{
//计算每两个索引值之间的间隔
int temp = res[i] - res[i - 1]-1;
//返回最大的值
if (temp>result)result = temp;
}
//计算最后一个索引值与字符串结尾的间隔
int temp = s.size() -1- res.back();
if (temp>result&&temp != 1)result = temp;
return result;
}
};