题目链接:
链接: 最长有效括号.
题目描述:
给你一个只包含 ’( '和 ’) ’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
测试样例:
示例 1:
输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"
示例 2:
输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"
示例 3:
输入:s = ""
输出:0
示例 3:
输入:s = "(())"
输出:4
解释:最长有效括号子串是 "(())"
参考题解:
时间复杂度:O(N) ;
@Override
class Solution {
public:
int longestValidParentheses(string s) {
int slen = s.size();
int laststart = 0;
int maxlen = 0;
stack<int>start;
for(int i = 0; i < slen; ++i)
{
if(s[i] == '(') start.push(i);
else
{
if(!start.empty())
{
start.pop();
if(!start.empty())
{
maxlen = max(maxlen, i - start.top());
}
else
{
maxlen = max(maxlen, i - laststart + 1);
}
}
else
{
laststart = i + 1;
}
}
}
return maxlen;
}
};
执行结果:
解题历程:
看到 括号匹配 就想到用栈来解决。一开始没想着引入 laststart 这个参数,想着用栈顶元素就可以算出 maxlen 。直到 ‘()()() ’ 样例出错才想到仅靠栈顶元素是无法“回忆”到第一个左括号的位置的,因此引入一个参数来记录。 总的来说,只进行了一个循环,遍历了一次输入字符串。因此,时间复杂度为O(N)。
|