一、题目描述
给你一个只包含 '('
和 ')'
的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = "(()" 输出:2 解释:最长有效括号子串是 "()"
示例 2:
输入:s = ")()())" 输出:4 解释:最长有效括号子串是 "()()"
示例 3:
输入:s = "" 输出:0
提示:
0 <= s.length <= 3 * 104
s[i]
为'('
或')'
二、思路分析
本题可以采用栈的方法解决,创建一个 leftStart 变量来表示指向合法括号的最左边的索引位置,用 result 记录最长有效(格式正确且连续)括号子串的长度。
三、代码参考
1、Java
class Solution {public int longestValidParentheses(String s) {// 创建栈空间Stack<Integer> stack = new Stack<>();// result 记录最长有效(格式正确且连续)括号子串的长度int result = 0;// 设置变量 leftStart 表示合法括号序列的起始索引位置,指向一个左括号,初始值为 0int leftStart = 0 ;// 循环遍历字符串数组for(int i = 0; i < s.length(); i++){// 访问左括号时,把它存储到栈里if(s.charAt(i) == '('){stack.push(i);}// 访问右括号时else{// 如果当前栈为空,说明这个右括号在前面没有和它匹配的左括号,那么 leftStart 需要发生改变if(stack.isEmpty()){// 索引变为当前字符的下一个leftStart = i + 1;}else{// 移除栈顶元素stack.pop();// 如果此时栈为空,说明当前右括号为右端点的合法括号序列的左端点为 leftStart,则更新长度 i - leftStart + 1if(stack.isEmpty()){result = Math.max(result, i - leftStart + 1);}// 如果栈不为空,找到了一组合法的括号序列,左括号是刚刚弹出的元素,长度可以通过 i - stack.peek() 获取else{result = Math.max(result, i - stack.peek());}}}}// 返回结果return result;}
}
2、Python
class Solution(object):def longestValidParentheses(self, s):# 创建栈空间stack = []# result 记录最长有效(格式正确且连续)括号子串的长度result = 0# 设置变量 leftStart 表示合法括号序列的起始索引位置,指向一个左括号,初始值为 0leftStart = 0# 循环遍历字符串数组for i in range(len(s)):# 访问左括号时,把它存储到栈里if s[i] == '(':stack.append(i)# 访问右括号时else :# 如果当前栈为空,说明这个右括号在前面没有和它匹配的左括号,那么 leftStart 需要发生改变if not stack:# 索引变为当前字符的下一个leftStart = i + 1else :# 移除栈顶元素stack.pop()# 如果此时栈为空,说明当前右括号为右端点的合法括号序列的左端点为 leftStart,则更新长度 i - leftStart + 1if not stack:result = max(result, i - leftStart + 1)# 如果栈不为空,找到了一组合法的括号序列,左括号是刚刚弹出的元素,长度可以通过 i - stack[-1] 获取else :result = max(result, i - stack[-1])# 返回结果return result