当前位置: 首页 > news >正文

最长有效括号python_leetcode 032中最长有效括号的Python实现,Leetcode032,python

Leetcode 032 最长有效括号

一、题目描述

题目描述:给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。

示例1:

输入

: “)()())”

输出: 4

解释: 最长有效括号子串为 “()()”

实例2:

输入: “())()”

输出: 2

解释: 最长有效括号子串为 “()”

二、解法

1.动态规划

思路 :将"(“对应位置的值置为0,遇见右括号才进行更新

情况1:当s[i]=”)" and s[i-1]="(",即s形如“…()”的时候:

dp[i] = dp[i-2]+2

情况2:当s[i]=")" and s[i-1]=")",即s形如“…()((()))”的时候:

如果 s[i]=")" and s[i-dp[i-1]-1]="(":

更新规则为:dp[i] = 2 + dp[i-1] + dp[i-dp[i-1]-1-1]

其中,2代表的是s[i-dp[i-1]-1]="("和s[i]匹配,dp[i-dp[i-1]-1-1]代表的是s[i-dp[i-1]-1]左边的字符的匹配情况

dp[i-1]则是(i,i-dp[i-1]-1)之间字符的匹配情况

class Solution:

def longestValidParentheses(self, s):

dp = [0 for _ in range(len(s))]

max_len = 0

for i in range(len(s)):

if s[i]==")" :

# if s[i-1]=="(" and (i-2>=0):

# dp[i] = dp[i-2]+2

if s[i-dp[i-1]-1]=="(" and (i-dp[i-1]-1>=0):

dp[i] = 2 + dp[i-1] + dp[i-dp[i-1]-1-1]

print(dp)

return max(dp)

# 修改:因为我发现第二个if包括了第一个if的内容,可以把第一个if去掉,去掉后dp数组并未改变

2.栈

思路 :

对于遇到的每个 ‘(’ ,我们将它的下标放入栈中

对于遇到的每个 ‘)’,我们先弹出栈顶元素表示匹配了当前右括号:

如果栈为空,说明当前的右括号为没有被匹配的右括号,我们将其下标放入栈中来更新我们之前提到的「最后一个没有被匹配的右括号的下标」

如果栈不为空,当前右括号的下标减去栈顶元素即为「以该右括号为结尾的最长有效括号的长度」

我们从前往后遍历字符串并更新答案即可。

需要注意的是,如果一开始栈为空,第一个字符为左括号的时候我们会将其放入栈中,

这样就不满足提及的「最后一个没有被匹配的右括号的下标」,为了保持统一,

我们在一开始的时候往栈中放入一个值为 −1 的元素。

class Solution:

def longestValidParentheses(self, s):

h = [-1]

max_len = 0

for i in range(len(s)):

if s[i]=="(":

h.append(i)

else:

# 这步为关键之处,先出栈,再判断栈是否为空

h.pop()

if len(h)>0:

max_len = max(max_len,i-h[-1])

else:

h.append(i)

return max_len

3.正向逆向结合法

以“()(()()”和"())()()"为例

思路 :利用一个指针从头移动到字符串s的尾部(正向),然后再移动回来(逆向)

指针移动时维护left和right的值,left和right表明左右括号的数量,当左右括号数量相等时候,此时的匹配括号长度为left*2

需要注意的是,在正向移动的时候,发现右括号数量大于左括号数量时候,置left=right=0(不反向移动的话,对于’()(()()'输出长度为2,正确是4)

在反向移动时候,发现左括号数量大于右括号时候,置left=right=0

class Solution:

def longestValidParentheses(self, s):

max_len = 0

left = 0

right = 0

lenth = len(s)

# 正向

for i in range(lenth):

if s[i]=="(":

left += 1

else:

right += 1

if right > left:

right = 0

left = 0

elif right==left:

max_len = max(max_len,left*2)

else:

pass

# 逆向

right = 0

left = 0

for i in range(lenth-1, -1, -1):

if s[i]=="(":

left += 1

else:

right += 1

if right < left:

right = 0

left = 0

elif right==left:

max_len = max(max_len,left*2)

else:

pass

return max_len

Reference

相关文章:

  • 60多套html5移动端模板_扫盲贴:全网最系统、完整的Web前端和移动APP开发知识...
  • python实现端口转发_python实现超简单端口转发的方法
  • x9此计算机上没有hasp_150马力23方货厢,跑快递快运不妨看看陕汽轩德X9蓝牌轻卡...
  • 贝叶斯思维 统计建模的python_《贝叶斯思维:统计建模的Python学习法》--第3章Estimation(估计)介绍...
  • 手机 调起自带地图 java_安卓11系统再加紧封锁!国内第三方手机应用商店或将全部阵亡?...
  • 串口中断和定时器中断_STM32f103单片机(四)——定时器中断
  • 多个参数变更update_PTOSC在线DDL变更工具使用攻略
  • php和python学不明白_现在自学php和python那个合适?
  • 交通流元胞自动机模拟仿真 matlab源码_SLM工艺仿真综述(三)之《金属3D打印仿真的解决方案与思路 . 下篇》...
  • python 菜单按钮打开新窗口_Python Tkinter Menubutton菜单按钮
  • python selenium翻页_Python+Selenium自动化实现分页处理
  • python中不相等符号_python的关系运算符中,用来表示不等于的符号是
  • python 预测分析_如何用Python来预测分析离职率呢
  • mysql big转字符串_mysql的这些坑你踩过吗?快来看看怎么优化mysql
  • windows api 刷新控件_基于 .NET 5的ComponentOne控件示例正式推出
  • [译]前端离线指南(上)
  • co模块的前端实现
  • CSS中外联样式表代表的含义
  • HTML-表单
  • java正则表式的使用
  • log4j2输出到kafka
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Quartz初级教程
  • Shell编程
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • vue-cli3搭建项目
  • 阿里云前端周刊 - 第 26 期
  • 初识 webpack
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 自制字幕遮挡器
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #前后端分离# 头条发布系统
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (待修改)PyG安装步骤
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (四)汇编语言——简单程序
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)使用VMware vSphere标准交换机设置网络连接
  • .cfg\.dat\.mak(持续补充)
  • .net 7 上传文件踩坑
  • .NET Remoting学习笔记(三)信道
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .Net Winform开发笔记(一)
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET/C# 的字符串暂存池