LeetCode 32. 最长有效括号

1. 题目

给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。

示例1:
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”

示例 2:
输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”

2. 题解

参照题解地址:https://leetcode-cn.com/problems/longest-valid-parentheses/solution/zui-chang-you-xiao-gua-hao-by-leetcode/

遇到括号问题,上次在 LeetCode 20. 有效括号 遇到过,当时的方法是利用栈来解决,本题也是利用栈来求解。
我们对字符串进行遍历,具体步骤如下:

  1. 检测到左括号 " ( ",将它的下标压入栈;
  2. 检测到右括号 " ) ",
    2.1 首先弹出栈顶元素,然后将当前右括号的下标与出栈操作之后的栈顶元素求差,即: 有效括号长度 = 当前右括号的下标 - 与之匹配的左括号的左边字符的下标
    2.2 如果出栈操作后,栈为空,则将当前右括号的下标压入栈,进行下一次检测。





3. Java实现

import java.util.Scanner;
import java.util.Stack;

class Solution01 {
	public int longestValidParentheses(String s) {
		int maxres=0;//初始化最大长度的变量
		Stack<Integer> stack = new Stack<>();
		stack.push(-1);//先将-1压入栈,以便下一次计算有效长度
		for(int i=0;i<s.length();i++) {//遍历字符串的索引
			if(s.charAt(i) == '(') {//如果遇到左括号,则将其的下标压入栈
				stack.push(i);
			}else {//否则就是遇到了右括号 
				stack.pop();//将上一个括号的下标出栈
				if(stack.empty()) {//如果出栈后,栈为空
					stack.push(i);//则将当前括号的下标压入栈,继续遍历下一个括号
				}else {//如果出栈后 栈不为空,则计算最大有效括号长度
					maxres=Math.max(maxres, i-stack.peek());//即为当前右括号的下标,减去其左括号左边的索引值(栈顶的内容) 也就是 i-stack.peek()
				}
			}
		}
		return maxres;
	}
	
	//test case
    public static void main(String[] args){
    Solution01 test=new Solution01();
    System.out.println("input String :");
    Scanner sc = new Scanner(System.in);
    String str = sc.next().toString();
    int result = test.longestValidParentheses(str);
    System.out.println("result is:");
    System.out.print(result);
    
    
    sc.close();
    
    }
}


4.参考题解

链接
本人只是学习者,做完题记录做题过程,有助于理解。本题的解决思路和出现的图片,参考于链接中的题解,对本题解原作者表示感谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值