算法:最长有效括号子串的长度

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

一、背景介绍

二、解题步骤

2.1 解题思路:

2.1.2 第二步,入栈出栈操作

2.1.3 第三步,保存最大长度

2.1.4 第四步,计算连续的括号长度

2.2 代码示例:

总结


提示:以下是本篇文章正文内容,下面案例可供参考

一、背景介绍

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

输入:s = "(()"

输出:2

解释:最长有效括号子串是 "()"

输入:s = ")()())"

输出:4

解释:最长有效括号子串是 "()()"

二、解题步骤

2.1 解题思路:

1)遇到这种括号的题目,我们首先想到的是栈Stack,

2)遇到左括号,压栈,遇到右括号,出栈

3)得有个临时变量来保存当前已匹配括号的最大长度

4)计算已连续匹配括号长度的方法,既然是连续的,那么肯定是当前右括号的下标 - 匹配的左括号的下标+1,也即为:当前右括号的下标 - 匹配的左括号的前一个元素的下标

5)在第四步中的读取,不能破坏栈的结构,所以得用peek方法

2.1.1 第一步,定义栈

Stack<Integer> stack = new Stack<>();

2.1.2 第二步,入栈出栈操作

if (str.charAt(i) == '(') {
    // 遇到'(',压入其索引
    stack.push(i);
} else {
    // 遇到')',弹出栈顶元素
    stack.pop();
}

2.1.3 第三步,保存最大长度

// 记录最大长度
int maxLength = 0;

2.1.4 第四步,计算连续的括号长度

i - stack.peek()

2.2 完整代码示例:

@Test
public void test() {
    String str = "(())(()";
    // 记录最大长度
    int maxLength = 0;
    Stack<Integer> stack = new Stack<>();
    // 初始化栈,压入-1作为哨兵,用于处理第一个字符是'('的情况
    stack.push(-1);
    for (int i = 0; i < str.length(); i++) {
        if (str.charAt(i) == '(') {
            // 遇到'(',压入其索引
            stack.push(i);
        } else {
            // 遇到')',弹出栈顶元素
            stack.pop();
            if (stack.isEmpty()) {
                // 如果栈为空,说明当前')'没有匹配的'(',将其索引压入栈中
                stack.push(i);
            } else {
                // 计算当前索引与栈顶元素的差值,更新最大长度
                maxLength = Math.max(maxLength, i - stack.peek());
            }
        }
    }
}


总结

每天进步一点点!

相关推荐

  1. 算法有效括号长度

    2024-05-05 04:36:01       26 阅读
  2. 【找重复长度

    2024-05-05 04:36:01       34 阅读
  3. 算法题】32. 有效括号

    2024-05-05 04:36:01       52 阅读
  4. leetcode有效括号

    2024-05-05 04:36:01       36 阅读
  5. 算法】【动规】斐波那契序列长度

    2024-05-05 04:36:01       72 阅读
  6. LeetCode 32:有效括号

    2024-05-05 04:36:01       55 阅读
  7. LeetCode 32. 有效括号

    2024-05-05 04:36:01       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-05 04:36:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-05 04:36:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-05 04:36:01       87 阅读
  4. Python语言-面向对象

    2024-05-05 04:36:01       96 阅读

热门阅读

  1. react和vue在跨平台方面的比较

    2024-05-05 04:36:01       29 阅读
  2. 使用 vscode 远程调试目标板的 c 语言代码

    2024-05-05 04:36:01       29 阅读
  3. MogDB&openGauss中的Bitmap Index Scan

    2024-05-05 04:36:01       27 阅读
  4. spingMVC一个controller最多可以同时响应多少请求

    2024-05-05 04:36:01       25 阅读
  5. STM32的外设总了解

    2024-05-05 04:36:01       36 阅读
  6. 经典面试题:你觉得 Go 在什么时候会抢占 P?

    2024-05-05 04:36:01       31 阅读
  7. 1.Spring Security介绍

    2024-05-05 04:36:01       153 阅读
  8. Vue框架知识点表格总结

    2024-05-05 04:36:01       37 阅读
  9. 使用Spring Boot快速构建Spring应用

    2024-05-05 04:36:01       32 阅读