作者简介:C/C++ 、Golang 领域耕耘者,创作者
个人主页:作者主页
活动地址:CSDN21天学习挑战赛
题目来源: leetcode官网
如果感觉博主的文章还不错的话,还请关注➕ 、点赞👍 、收藏🧡三连支持一下博主哦~~~
给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例1:
输入:s = “(()”
输出:2
解释:最长有效括号子串是 “()”
示例2:
输入:s = “)()())”
输出:4
解释:最长有效括号子串是 “()()”
示例 3:
输入:s = “”
输出:0
此题方法之一是用栈
我们通过标记合法的括号,可以得出,每一段合法的括号在字符串出现的位置一定是连续且不相交的
做括号匹配的这题可以用栈存储相应的信息,算法过程为:
如果栈为空,说明以当前右括号为右端点的合法括号序列的左端点为start,则更新答案 i - start + 1
如果栈不为空,说明以当前右括号为右端点的合法括号序列的左端点为栈顶元素的下一个元素,则更新答案i - st.top()
4、遇到右括号)且当前栈为空,则当前的 start 开始的子串不再可能为合法子串了,下一个合法子串的起始位置必定是当前遍历位置 i + 1 开始,更新 start = i + 1。
5、最后返回答案即可
class Solution {
public:
int longestValidParentheses(string s) {
stack<int> st;
int re = 0;
for(int i = 0, start = 0; i < s.size(); i ++)
{
if(s[i] == '(') st.push(i);
else
{
if(st.size())
{
st.pop();
if(st.empty()) re = max(re, i - start + 1);
else re= max(re, i - st.top()); // 因为之前已经弹出来了一个元素 (st.top() + 1) - 1
}
else
start = i + 1; // 更新
}
}
return re;
}
};
执行结果:
其中字符串只遍历一次, 时间复杂度为O(n)
如果觉得对你有帮助的话:
👍 点赞,你的认可是我创作的动力!
🧡 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!