Longest Valid Parentheses

二进制
• 阅读 1358

Longest Valid Parentheses 题解


题目描述

Longest Valid Parentheses
即从只含有'('')'的字符串s中找出最长有效子串sub(s),返回该子串的长度len
如:s=")()())"",sub(s)="()()";len=4

题解

对字符串进行遍历,遇到相邻配对的'('')'则消去,并与此处存在的匹配子串(不存在即为空串)合并,并记录此处存在某个长度的匹配子串。并与已知最大长度比较,若大于则更新最大长度。类似于寻找无向图中最大匹配时建立交错树时的缩花操作。

例如s=")()())""。则有

  1. left = 0,right = 1,len = 0.
  2. s[left]=')'s[right]='('. 不匹配,遍历下一个:left = 1,right = 2.
  3. s[left]='('s[right]=')'. 匹配,消去:left = 0,right = 3. 并记录s[0]处有一个长度为2的有效子串,更新最大长度len = 2.
  4. s[left]=')'s[right]='('. 不匹配,遍历下一个:left = 3,right = 4.
  5. s[left]='('s[right]=')'. 匹配,消去:left = 0,right = 5,并与之前s[0]处记录的长度为2的有效子串合并,更新最大长度len = 4.
  6. s[left]=')'s[right]=')'. 不匹配,遍历下一个:left = 5,right = 6. 到达字符串s末尾,结束。
  7. 得到最长有效子串的长度为len = 4.

假设原字符串s长度为n,时间复杂度为O(n)

代码

typedef int _Type;
class Solution {
public:
    int longestValidParentheses(const std::string& s) {
        _Type left = 0, longest = 0, len = s.size();
        std::vector<_Type> vec(len);
        for (_Type i = 0; i < len; ) {
            if (s[i] == '(') {
                vec[left++] = i++;
            } else if (s[i++] == ')' && left > 0) {
                _Type tmp = i - vec[--left];
                if (tmp > longest)
                    longest = tmp;
                if (i < len && s[i] == '(')
                    vec[left++] = i++ - tmp;
            }
        }
        return longest;
    }
};

总结

主要应用了缩花思想。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
AS Library 使用NDK 的一些坑 Unable to strip library (+深入了解部分gradle机制)
转自: https://www.twblogs.net/a/5c53f1d5bd9eee06ee217e42(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fwww.twblogs.net%2Fa%2F5c53f1d5bd9eee06ee217e42)和https://fuckn
Wesley13 Wesley13
3年前
HTTP面试题(二):HTTP请求报文和响应报文格式
!(https://oscimg.oschina.net/oscnet/0406894fb1274bee91fc53c84c516576.jpg)看都看了还不点个赞!(https://oscimg.oschina.net/oscnet/095d444dc9a449ee85afd19b00fdf52b.png)!(h
Stella981 Stella981
3年前
Duang,HUAWEI DevEco IDE全面升级啦
想感受全新UI带来的视觉及交互体验、HiKey970开发板调测、HiAIAPI推荐和收藏、深度AI模型分析等新功能,体验高清晰度和流畅度的远程AI真机调测吗?!(https://oscimg.oschina.net/oscnet/f4e1bb24ff00b8c6ea27f75370a53bfbacd.jpg)全新的UI设计
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这