首页 > 其他分享 >LeetCode题练习与总结:最长有效括号

LeetCode题练习与总结:最长有效括号

时间:2024-03-12 23:59:23浏览次数:26  
标签:子串 maxLen 复杂度 练习 括号 索引 字符串 LeetCode

一、题目

给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

二、解题思路

1. 初始化一个栈和一个变量 maxLen 来记录最长有效括号子串的长度。栈用于存储左括号的索引,maxLen 初始化为 0。

2. 遍历字符串 s 中的每个字符。对于每个字符,执行以下操作:

(1)如果当前字符是左括号 '(',则将其索引压入栈中。

(2)如果当前字符是右括号 ')',则执行以下步骤:

  • 如果栈不为空,并且栈顶元素是左括号索引,说明找到了一个匹配的括号对。此时,弹出栈顶元素(左括号索引),并计算当前右括号索引与栈顶左括号索引之间的距离(即有效括号子串的长度)。
  • 更新 maxLen 为当前 maxLen 和刚刚计算的有效括号子串长度的最大值。
  • 如果栈为空,说明当前的右括号没有匹配的左括号,将当前索引作为新的左括号压入栈。

3. 遍历结束后,返回 maxLen 作为最长有效括号子串的长度。

这个思路的核心在于利用栈来跟踪左括号的位置,并通过栈顶元素与当前右括号索引之间的距离来确定有效括号子串的长度。这种方法不需要额外的动态规划数组,只需要一个栈和一些基本的索引操作。

三、具体代码

class Solution {
    public int longestValidParentheses(String s) {
        int maxLen = 0;
        int n = s.length();
        if (n == 0) return 0;

        Stack<Integer> stack = new Stack<>();
        stack.push(-1); // 初始化栈,-1 表示没有匹配的左括号

        for (int i = 0; i < n; i++) {
            if (s.charAt(i) == '(') {
                stack.push(i); // 遇到左括号,压入栈
            } else {
                // 遇到右括号
                stack.pop(); // 弹出栈顶元素,即左括号的索引
                if (stack.isEmpty()) {
                    // 如果栈为空,说明当前右括号没有匹配的左括号
                    stack.push(i); // 将当前索引作为新的左括号压入栈
                } else {
                    // 如果栈不为空,计算当前有效括号的长度
                    int leftIndex = stack.peek();
                    maxLen = Math.max(maxLen, i - leftIndex);
                }
            }
        }

        return maxLen;
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 时间复杂度:O(n)。
  • 代码中有两个循环。
  • 外层循环遍历字符串的每个字符,内层循环(实际上是一个条件判断)在遇到右括号时可能会执行。
  • 在最坏的情况下,每个字符都会导致内层循环执行,因此时间复杂度是 O(n),其中 n 是字符串的长度。
2. 空间复杂度
  • 空间复杂度:O(n)。
  • 栈的大小取决于字符串中左括号和右括号的分布。
  • 在最坏的情况下,如果字符串中的所有括号都是成对出现的,那么栈的大小将等于字符串的长度。
  • 因此,空间复杂度是 O(n)。

五、总结知识点

  1. 栈(Stack):栈是一种后进先出(LIFO)的数据结构,它用于存储和管理数据。在这个问题中,栈用于跟踪左括号的索引,以便在遇到右括号时能够找到匹配的左括号。

  2. 字符串遍历:代码通过一个 for 循环遍历字符串的每个字符。这是处理字符串问题时常见的方法。

  3. 条件判断:在遍历过程中,代码使用 ifelse 语句来判断当前字符是左括号还是右括号,并根据条件执行不同的操作。

  4. 栈操作:代码中使用了栈的基本操作,包括 push(压入元素)和 pop(弹出元素)。push 用于将左括号的索引添加到栈中,而 pop 用于在找到匹配的右括号时移除左括号的索引。

  5. 变量更新:在遍历过程中,代码不断更新 maxLen 变量,以记录到目前为止找到的最长有效括号子串的长度。

  6. 边界条件处理:代码在开始时检查字符串长度是否为 0,如果是,则直接返回 0,因为空字符串没有有效的括号子串。

  7. 初始化:栈被初始化为包含一个特殊的值 -1,这个值表示没有匹配的左括号。这是一种常见的技巧,用于简化边界条件的处理。

  8. 数学运算:代码中使用了 Math.max 方法来获取两个整数的最大值,这是在更新最长有效括号子串长度时需要的操作。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

标签:子串,maxLen,复杂度,练习,括号,索引,字符串,LeetCode
From: https://blog.csdn.net/weixin_62860386/article/details/136427511

相关文章

  • [LeetCode][LCR174] 寻找二叉搜索树中的目标节点
    题目LCR174.寻找二叉搜索树中的目标节点某公司组织架构以二叉搜索树形式记录,节点值为处于该职位的员工编号。请返回第cnt大的员工编号。示例1:输入:root=[7,3,9,1,5],cnt=27/\39/\15输出:7示例2:输......
  • JS ATM练习案例(复习循环知识)
    需求:用户可以选择存钱、取钱、查看余额和退出功能。分析:1循环时反复出现提示框,所以提示框写到循环里面。2.退出的条件是4,所以是4就会结束循环3.提前准备一个金额预存储4取钱为减法操作,存钱为加法操作,查看为直接显示数额。5输入不同的值,可以用switch来执行不同操作。<!D......
  • 代码随想录算法训练营day21 | leetcode 530. 二叉搜索树的最小绝对差、501. 二叉搜索
    目录题目链接:530.二叉搜索树的最小绝对差-简单题目链接:501.二叉搜索树中的众数-简单题目链接:236.二叉树的最近公共祖先-中等题目链接:530.二叉搜索树的最小绝对差-简单题目描述:给你一个二叉搜索树的根节点root,返回树中任意两不同节点值之间的最小差值。差值是一个正数,......
  • LeetCode[题解] 1261. 在受污染的二叉树中查找元素
    首先我们看原题给出一个满足下述规则的二叉树:root.val==0如果 treeNode.val==x 且 treeNode.left!=null,那么 treeNode.left.val==2*x+1如果 treeNode.val==x 且 treeNode.right!=null,那么 treeNode.right.val==2*x+2现在这个二叉树受到「污......
  • 2024-03-12 leetcode写题记录
    目录2024-03-12leetcode写题记录160.相交链表题目链接题意解法解法一解法二2024-03-12leetcode写题记录160.相交链表题目链接160.相交链表题意给你两个单链表的头节点\(headA\)和\(headB\),请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回\(nu......
  • leetcode160.链表相交
    160.相交链表 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结......
  • 2024-03-11 leetcode写题记录
    目录2024-03-11leetcode写题记录206.反转链表题目链接题意解法876.链表的中间结点题目链接题意解法2024-03-11leetcode写题记录206.反转链表题目链接206.反转链表题意给你单链表的头节点head,请你反转链表,并返回反转后的链表。解法链表反转板子题,特殊处理下一个点......
  • Leetcode.19. 删除链表的倒数第 N 个结点
    给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。示例1:输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5]示例2:输入:head=[1],n=1输出:[]示例3:输入:head=[1,2],n=1输出:[1] 提示:链表中结点的数目为 sz1<=sz<=300<=Node.val<=100......
  • leetcode: 1261: 在受污染的二叉树中查找元素
    给出一个满足下述规则的二叉树:root.val==0如果 treeNode.val==x 且 treeNode.left!=null,那么 treeNode.left.val==2*x+1如果 treeNode.val==x 且 treeNode.right!=null,那么 treeNode.right.val==2*x+2现在这个二叉树受到「污染」,所有的 tree......
  • 洛谷题单指南-线性表-P1241 括号序列
    原题链接:https://www.luogu.com.cn/problem/P1241题意解读:括号配对问题,直观上是堆栈的应用。关键的匹配策略是读懂该句:考察它与它左侧离它最近的未匹配的的左括号。解题思路:本题所需核心数据结构是堆栈,由于要实现从栈顶找到第一个未匹配的左括号,所以堆栈中只存所有左括号。从......