LeetCode算法入门- Longest Valid Parentheses -day12

本文解析了LeetCode上的Longest Valid Parentheses问题,通过使用堆栈数据结构,实现了寻找给定括号序列中最长的有效括号子序列的算法。文章详细介绍了算法的思路和实现过程,包括如何遍历字符串、如何利用堆栈判断括号是否匹配以及如何计算最长有效括号子序列的长度。

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

LeetCode算法入门- Longest Valid Parentheses -day12

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

题目描述:
题目的意思是给定一个括号序列的字符串,找到最长有效括号子序列的长度。

Example 1:

Input: “(()”
Output: 2
Explanation: The longest valid parentheses substring is “()”

Example 2:

Input: “)()())”
Output: 4
Explanation: The longest valid parentheses substring is “()()”

思路分析:

此题同样可以用堆这个结构来实现,建立一个堆栈来存放字符在字符串中的位置,遍历整个数组,如果遇到左括号,则当前位置入栈;如果遇到右括号,则弹出栈顶元素,这个时候分成两种情况讨论:

  1. 如果此时栈为空,表示弹出的并非左括号,匹配失败,需要将当前位置入栈表示匹配的初始值
  2. 如果此时栈不为空,表示此次匹配成功,这是匹配的长度为当前位置减去栈顶元素的值;

算法实现如下:

class Solution {
    public int longestValidParentheses(String s) {
        Stack<Integer> stack = new Stack<>();
        //为了方便计算push一个匹配开始位置的前一个位置
        stack.push(-1);
        int result = 0;
        for(int i = 0; i < s.length(); i++){
            if(s.charAt(i) == '('){
                stack.push(i);
            }else{
                stack.pop();
                //空时表示匹配失败,将当前元素的位置push进去
                if(stack.isEmpty()){
                    stack.push(i);
                }
                else{
                    //i - stack.peek()表示当前匹配的长度,取最大值
                    result = Math.max(result, i - stack.peek());
                }
            }
        }
        return result;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值