IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Leetcode.32-最长有效括号(两方法)_ -> 正文阅读

[数据结构与算法]Leetcode.32-最长有效括号(两方法)_

题目链接

在这里插入图片描述

方法一:动态规划

要统计最长的有效括号。
一般这种题目就要求最长,最优的可以考虑用动态规划来做。基本可以保证时间复杂度在O(n)。

因为DP可以利用前面的状态方程的结果,而不会造成重复运算。

DP最关键的是找出问题与状态转移方程。

对于本题而言,要求最长的的有效括号()

问题:从0到n之间,最长有效括号子字符串的长度。

而,求一个括号字符串的长度,要包括,

当前检测到的有效长度+
内部的括号的有效连续的括号字符串的长度+
前面的最长有效连续的括号字符串的长度

状态转移方程:f(n)=2+f(n-1)+f(外部)

当然,我们需要一共数组来保存之前的子结果,然后放入状态转移方程。
在这里插入图片描述
第一个元素无论是上面,数组保存到都是0。
如果元素是(,则数组保存的是0,因为这是找连续有效的字符串,如果数组保存到是到目前为止,数组中的最长有效子串,则会导致,有一些无效元素也会被统计进来,这样是不合适的。

如果这确实是一个有效字串,则当前的前一个元素一定是非0的值。说明相邻的子串都是有效的。

如果想要找到当前的最长有效子串,则前提条件的保证当前遍历的)一定有一个与之唯一匹配的(,而为了找到,要借助可能存在的内部的最长有效子串。如果内部有,则说明这个有效子串是可行的,可被统计的,如果内部没有,则说明内部是0,或者内部就不是有效的。
在这里插入图片描述
在这里插入图片描述

代码

class Solution {
public:
    int longestValidParentheses(string s) {
        if(s.empty())
            return 0;
        int len=s.size();
        vector<int> v(len);
        v.push_back(0);
        for(int i=1;i<len;i++)
        {
            if(s[i]==')'&&((i-v[i-1]-1)>=0?s[i-v[i-1]-1]=='(':false))
                v[i]=v[i-1]+2+((i-v[i-1]-2)>=0?v[i-v[i-1]-2]:0);
            else
                v[i]=0;
        }
        int Max=0;
        for(int j=0;j<v.size();j++)
        {
            Max=max(v[j],Max);
        }
        return Max; 
    }
};

时间复杂度O(n),空间复杂度O(n)

方法二:正逆向相结合

这种方法适用于元素匹配的情况

  1. 先从0遍历到size()-1
  2. 再从size()-1遍历到0

先过一遍这个算法的过程,再介绍这个算法处理的特殊测试用例。

在这里插入图片描述
如果遍历到(,left就加一
如果遍历到),right就加1

什么时候代表有匹配的括号串?

当right和left一样时,说明统计到了匹配的括号串,其长度就需要加2。

如果right>left
说明)已经多于(,到目前的遍历来看,已经不符合有效字符串,则据目前为止,这次统计最长有效括号串已经到此为止,需要从0开始向后统计,则leftright需要重新置0。

当然,这并不能完全处理所有的测试用例

如果,是这种测试用例呢?
在这里插入图片描述
在这里插入图片描述
往后统计,则right就再也无法不能大于或等于left,而这种情况,后面是无法统计最长子串。所以就需要反向遍历一次,以保证,整个字符串的数据统计的正确性。

因为,作为一个(),理论上,无论是从左往右还是从右往左都是能得到一样的统计数据。

所以本题,使用正反两次遍历是为了验证数据的正确性。

class Solution {
public:
    int longestValidParentheses(string s) {
        int left=0;
        int right=0;
        int len=s.size();
        int max_len=0;
        for(int i=0;i<len;i++)
        {
            if(s[i]=='(')
                left++;
            if(s[i]==')')
                right++;
            if(left<right)
            {
                left=0;
                right=0;
            }
            if(left==right)
            {
                int l=left*2;
                max_len=max(l,max_len);
            }
                
        }
        left=0;right=0;
        for(int i=len-1;i>=0;i--)
        {
             if(s[i]=='(')
                left++;
            if(s[i]==')')
                right++;
            if(left>right)
            {
                left=0;
                right=0;
            }
            if(left==right)
            {
                int l=left*2;
                max_len=max(l,max_len);
            }
        }
        return max_len;
    }
};

时间复杂度O(n),空间复杂度O(1)

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-22 11:11:28  更:2021-10-22 11:11:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:42:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码