Leetcode 栈 Longest Valid Parentheses

本文介绍了一种使用栈解决最长有效括号问题的方法。通过遍历输入字符串并利用栈记录左括号的位置,算法能高效地找出最长的有效括号子串长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Longest Valid Parentheses

  Total Accepted: 14818  Total Submissions: 75749 My Submissions

Given a string containing just the characters '(' and ')', find the length of the longest valid (well-formed) parentheses substring.

For "(()", the longest valid parentheses substring is "()", which has length = 2.

Another example is ")()())", where the longest valid parentheses substring is "()()", which has length = 4.






题意:给定一个包含括号 '(',')'的字符串,返回最长匹配的括号数目
思路1:栈
用一个变量_max表示当前最长匹配的括号数
不存右括号,只存左括号的index。扫描一遍字符串,
如果当前的字符是'(',则压栈
如果当前的字符是')',则
1.若栈空,则当前的')'没有一个'('与它匹配,它可以作用它左右两个匹配的括号串的分割点,用一个变量 last 记录下它的坐标。
last的初始值是-1,当遇到新的分割点时,我们更新 last,并可以得到两个 last之间的匹配括号的长度
2.若栈非空,则当前的')'与栈顶的'('匹配
将栈顶元素出栈
如果此时栈为空,则找到了一组匹配括号串,更新 _max = max(_max, last - i)
如果此时栈不空,则栈顶的'('还没找到它的')',因为栈顶元素有可能找不到它的')',因此,此时要更新 _max = max(_max, i - stack.top())

复杂度:时间O(n),空间O(n)

int longestValidParentheses(string s){
	int _max = 0, last = -1;
	stack<int> left;
	for(int i = 0;  i < s.size(); ++i){
		if(s[i] == '(') left.push(i);
		else{
			if(left.empty()) last = i;
			else{
				left.pop();
				if(left.empty()){
					_max = max(_max, i - last);
				}else{
					_max = max(_max, i - left.top());
				}
			}
		}
	}
	return _max;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值