最长有效括号(C语言)

题目链接:. - 力扣(LeetCode)

这道题,我看了一种解法,觉得很好,来分享一下

这道题主要是   思考    当前 )  与之匹配 ( 在哪里  ,记录下来,最后比较最大值

例子:

第一个右括号,由于没有与之匹配的左括号,所以不记录,但要更改起始位置

第一个左括号入栈,记录下标

第二个右括号有与之匹配的左括号,max = 2

第二个左括号入栈

第三个右括号,最长与之匹配的左括号是第一个左括号 max = 当前位置 - 起始位置 + 1

第四个右括号,没有与之匹配的左括号

难点在于:起始位置怎么变:当右括号进入,并且栈里没有左括号时,起始位置发生改变

例子:( ( ) ( ) 

主要是最后一个右括号与之匹配的左括号为第二个左括号

但是第二个左括号会被踢出去

所以找第一个左括号

由此代码写出:

typedef struct Stack

{

    int* arr;

    int size;

    int top;

}ST;

void StackInit( ST* obj )

{

    obj->arr = (int*)malloc(sizeof(int)*30005);

    obj->size = 0;

    obj->top = -1;

}

void StackPush( ST* obj , int pi )

{

    obj->arr[++obj->top] = pi;

    obj->size++;

}

void StackPop( ST* obj )

{

    obj->size--;

    obj->top--;

}

int StackTop( ST* obj )

{

    return obj->arr[obj->top];

}

bool StackIsEmpty( ST* obj )

{

    return obj->size==0;

}

int longestValidParentheses(char* s) {

    ST obj;

    StackInit( &obj);

    int i = 0;

    int max = 0;

    int start = 0;

    for( i = 0 ; s[i] != '\0' ; i++)

    {

        if( s[i] == '(' )

        {

            StackPush( &obj,i);

        }

        else

        {

            if( StackIsEmpty(&obj) )

                start = i + 1;

            else

            {

                StackPop(&obj);

                if( StackIsEmpty(&obj) )

                {

                    max = fmax ( max , i - start + 1 );

                }

                else

                {

                    max = fmax( max , i - StackTop(&obj) );

//这里要解释一下,为什么会写StackTop , 首先要明确删除的元素与取得元素是相邻的关系

//如果是这个关系  )()  并且左括号栈不为空 那么这两个必然会匹配或者start移动(就要为空)

// 第一种情况 ())()  此时为空,并且start移动

// 第二种情况 ()() 此时左括号栈为空

// 这两种情况均已已知条件不符

                }

            }

        }

    }

    return max;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/780463.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

听了中国电信关闭Wi-Fi双频合一功能之后,到底该连接2.4GHz还是5GHz频段?

前言 前段时间沸沸扬扬的关闭双频合一建议,小白也尝试关闭了一下,网络确实是好了不少。 有小伙伴还是有点疑虑,中国电信说的关闭Wi-Fi双频合一功能真的有用吗?点击下方蓝字一探究竟! 中国电信建议关闭路由器的双频合一…

万字详解PHP+Sphinx中文亿级数据全文检索实战(实测亿级数据0.1秒搜索耗时)

Sphinx查询性能非常厉害,亿级数据下输入关键字,大部分能在0.01~0.1秒,少部分再5秒之内查出数据。 Sphinx 官方文档:http://sphinxsearch.com/docs/sphinx3.html极简概括: 由C编写的高性能全文搜索引擎的开源组件&…

Python-基础部署

机器没法直接读懂我们写的代码,需要解释解释器作为中间的翻译,把代码转换成字节码在执行 安装python解释器 Download Python | Python.org 安装代码编辑器 pycharm Thank you for downloading PyCharm! 创建一个项目,每个项目里的文件夹…

Cisco ISR 1000 Series IOS XE Release IOSXE-17.13.1a ED

Cisco ISR 1000 Series IOS XE Release IOSXE-17.13.1a ED 思科 1000 系列集成多业务路由器系统软件 请访问原文链接:https://sysin.org/blog/cisco-isr-1000/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 思科…

如何解决EventSource 删除单词的前置空格问题

如下代码,EventSource会把单词的前置空格吃掉,比如“ blank” 会变成"blank",这会导致输出的英语单词连在一起 const eventSource new EventSource(api_question); eventSource.onmessage streamEvent > {const data streamEvent.data;handleTest(…

ubuntu18.04 pycharm

一、下载pycharm (1)进入官网下载Download PyCharm: The Python IDE for data science and web development by JetBrains 选择专业版(professional)直接点击下载(download),我下载的是2023.3…

数字孪生|初识山海鲸可视化

哈喽,你好啊,我是雷工! 最近开始学习了解数字孪生的软件,看山海鲸可视化介绍的不错,便准备下载了试一下。 01 、概述 该软件是一套技术自主可控的、国产自研的、零代码数字孪生可视化工具集, 02、产品定…

从0到1利用express搭建后端服务

目录 1 架构的选择2 环境搭建3 安装express4 创建启动文件5 express的核心功能6 加入日志记录功能7 日志记录的好处本节代码总结 不知不觉学习低代码已经进入第四个年头了,既然低代码很好,为什么突然又自己架构起后端了呢?我有一句话叫低代码…

EasyRecovery2024中文版数据恢复软件功能全面介绍

EasyRecovery2024是世界著名数据恢复公司 Ontrack 的技术杰作,它是一个威力非常强大的硬盘数据恢复工具。能够帮你恢复丢失的数据以及重建文件系统。 EasyRecovery不会向你的原始驱动器写入任何东东,它主要是在内存中重建文件分区表使数据能够安全地传输…

C语言如何进⾏函数的⼀般调⽤?

一、问题 函数调⽤的⼀般样式都是⼀样的,简称为函数的⼀般调⽤,那么函数的⼀般调⽤的形式是什么呢? 二、解答 在C语⾔中,函数调⽤的⼀般形式如下。 函数名(实际参数表) 对⽆参函数调⽤时,则⽆实际参数表。实际参数表…

nodejs下载安装以及npm、yarn安装及配置教程

1、nodejs下载安装 ​ 1.1、使用nodejs版本管理工具下载安装,可一键安装、切换不同nodejs版本, nvm-setup.zip:安装版,推荐使用 本次演示的是安装版。 1、双击安装文件 nvm-setup.exe 选择nvm安装路径 例如:E:\Soft…

ssm 科研奖励申报管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 ssm 科研奖励申报管理系统是一套完善的信息系统,结合springMVC框架完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码和数据库,系统主要采用…

[CSS]使用flex实现二联三联布局

1. 使用flex实现二联布局 思路&#xff1a;左侧为固定width&#xff0c;右侧为所有 <style type"text/css">.wrap {display: flex;justify-content: space-between;} ​.left,.right,{height: 100px;} ​.left {width: 200px;background: coral;} ​.right {…

iOS - Runloop介绍

文章目录 iOS - Runloop介绍1. 简介1.1 顾名思义1.2. 应用范畴1.3. 如果没有runloop1.4. 如果有了runloop 2. Runloop对象3. Runloop与线程4. 获取Runloop对象4.1 Foundation4.2 Core Foundation4.3 示例 5. Runloop相关的类5.1 Core Foundation中关于RunLoop的5个类5.2 CFRunL…

java复原IP 地址(力扣Leetcode93)

复原IP 地址 力扣原题链接 问题描述 有效 IP 地址正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 ‘.’ 分隔。 例如&#xff1a;“0.1.2.201” 和 “192.168.1.1” 是有效 IP 地址&#xff0c…

【CASS精品教程】CASS11台阶画法大全

文章目录 一、无边台阶二、有边台阶三、圆弧无边台阶四、U型台阶五、曲线U型台阶六、L型台阶一、无边台阶 点击【居民地】→【房屋附属】→【台阶】: 选择【两点边】即可。 两点边的绘制方法是,依次点击四个点,或者点击三个点后空格,注意台阶缺口(有白色线条)为下。 四…

vue3 中 ref和reactive、shallowRef和shallowReactive,toRaw 和 markRaw的区别

在 Vue 3 中,ref、reactive、shallowRef、shallowReactive 是用于创建响应式数据的方法,而 toRaw 和 markRaw 则是用于处理响应式数据的辅助函数。让我分别解释它们的区别: ref vs reactive: ref:用于创建一个包装了基本数据类型(如数字、字符串等)的响应式引用。它返回一…

Linux/Ubuntu/Debian 终端命令:设置文件/目录权限和组

更改文件权限&#xff1a; chmod filename&#xff1a;根据指定的权限更改文件的权限。 例如&#xff1a; chmod ux filename # 为文件所有者添加执行权限 递归更改目录权限&#xff1a; chmod -R <说明> 目录名称&#xff1a;递归更改目录及其内容的权限。 例如&#xf…

开发DDD伪创新工具-UMLChina建模知识竞赛第5赛季第7轮(无人答对,再换题重发)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题&#xff0c;即可获得本轮优胜。 如果有第4题&#xff0c;第4题为附加题&am…

大数据-hive,初步了解

1. Hive是什么 Hive是基于Hadoop的数据仓库解决方案。由于Hadoop本身在数据存储和计算方面有很好的可扩展性和高容错性&#xff0c;因此使用Hive构建的数据仓库也秉承了这些特性。 简单来说&#xff0c;Hive就是在Hadoop上架了一层SQL接口&#xff0c;可以将SQL翻译成MapRedu…