Leetcode 32 最长有序括号 Java

Leetcode 32 最长有序括号

题目描述

给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: “(()”
输出: 2

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

解题思路

对于后进先出的情况,利用栈。stack.peek()(栈顶)一直保存着有效括号开始的下标
遍历字符串,
如果是左括号,或者是右括号但栈顶没有与之匹配的左括号,则入栈。
如果为右括号,且栈顶有左括号与之匹配,则左括号出栈,出栈后:
如果栈是空的,说明前面的序列一直是有效的,max = i + 1;如果栈不为空,则这段有效括号的长度为:i - stack.peek()。stack.peek()一直保存着有效括号开始的下标

代码

public int longestValidParentheses(String s) {
        Stack<Integer> stack = new Stack<Integer>();
        char[] c = s.toCharArray();
        int max = 0;
        
        for(int i = 0; i < c.length; i++) {
        	//如果为右括号,且栈顶有左括号与之匹配
        	if(c[i] == ')' &&  ! stack.isEmpty() && c[stack.peek()] == '(') {
        		stack.pop();//左括号出栈
        		//如果栈是空的,说明前面的序列一直是有效的
        		if(stack.isEmpty()) {
        			max = i + 1;
        		} else if(max < i - stack.peek()){
        			//左括号出栈后,如果栈不为空,则这段有效括号的长度为:i - stack.peek(),
        			//因为左括号出栈了,所以peek()代表的下标减1了,所以才会让有效括号的长度==i - stack.peek()
        			//即左括号出栈后,peek()代表有效数组开始的下标-1
        			max = i - stack.peek();
        		}
        	} 
        	else { //如果不是右括号,或者没有与之匹配的左括号,则入栈
        		stack.push(i);
        	}
        }
		return max;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值