博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
32. Longest Valid Parentheses
阅读量:6682 次
发布时间:2019-06-25

本文共 1372 字,大约阅读时间需要 4 分钟。

题目链接:

解法一:使用栈,,

这道题的要求是在仅包含“(”和“)”的字符串中,找到最长的括号匹配的子串,返回其长度。

对于括号匹配,和同样的思路,用栈维护左括号,即在读取字符串的时候,遇到左括号就入栈。遇到右括号就出栈,同时判断当前括号匹配的子串是否为最长子串。

不过在判断括号匹配的子串的长度的时候,有一些值得注意的问题,其中需要借助变量l记录当前括号匹配的子串的左侧位置:

  1. 如果当前栈为空,这说明当前的右括号并不构成括号匹配的子串,则l移到下一位置。
  2. 如果当前栈不为空,弹出栈顶元素。此时,如果栈为空,说明加上当前的右括号可以构成括号匹配的子串,其子串长度就为l位置到当前位置的长度;如果栈不为空,则栈顶元素后面的括号对肯定是匹配的,因此子串长度就为栈顶元素位置的后一位置到当前位置的长度。
class Solution { public:     int longestValidParentheses(string s)     {         int res = 0, l = 0;         stack
si; for(int i = 0; i < s.size(); ++ i) { if(s[i] == '(') si.push(i); else { if(si.empty()) l = i + 1; else { si.pop(); if(si.empty()) res = max(res, i - l + 1); else res = max(res, i - si.top()); } } } return res; } };

 

 

 

方法二:递归,:

思路:

dp[i]表示以当前位置为终点的最长长度,则只能在')'处更新,

如果s[i-1-dp[i-1]]=='(',则说明当前位置可以和i-1-dp[i-1]位置匹配,dp[i]=dp[i-1]+2;

然后还要加上匹配位置之前的最长长度dp[i]+=dp[i-dp[i]];

class Solution {public:    int longestValidParentheses(string s)     {        int result=0;        s=')'+s;        vector
dp(s.length(),0); for(int i=1;i

 

转载于:https://www.cnblogs.com/bright-mark/p/9595292.html

你可能感兴趣的文章
web服务器比较(IIS,Tomcat,Apache,Resin )
查看>>
通过刷bios的方式在win8.1平板上启动windows phone模拟器
查看>>
Linux 串口、usb转串口驱动分析(2-2) 【转】
查看>>
[WPF/Silverlight]让INotifyPropertyChanged的实现更优雅一些
查看>>
linux中serial driver理解【转】
查看>>
例说linux内核与应用数据通信系列【转】
查看>>
JVM学习笔记(一)------基本结构【转】
查看>>
协变和逆变之疑问
查看>>
Form Head Data
查看>>
UITextField的总结
查看>>
linux 自旋锁和信号量【转】
查看>>
匿名函数
查看>>
Android模拟器上网的设置
查看>>
Cannot get WiFi AP state 错误
查看>>
.NET调试实例-实验1:死锁 (原创翻译)
查看>>
Microsoft-PetSop4.0(宠物商店)-数据库设计-Oracle
查看>>
Python黑帽编程 3.4 跨越VLAN
查看>>
hadoop2.0 和1.0的区别
查看>>
强制SQL Server执行计划使用并行提升在复杂查询语句下的性能
查看>>
RPi 2B Raspbian system install
查看>>