【力扣hot100题】(089)最长有效括号

这题目真是越做越难了。

但其实只是思路很难想到,一旦会了方法就很好做。

但问题就在方法太难想了......

思路还是只要遍历一遍数组,维护动态规划数组记录截止至目前位置选取该元素的情况下有效括号的最大值。

光是知道这个还不够,看了答案才知道每次可以取两个元素。

具体来说分三种情况:

  • 当前元素为'(',则最后取该元素时一定没有有效括号,所以元素取为0.
  • 当前元素为')',并且前面有元素且上一个元素为'(',这种情况就等于上上个元素数组维护的值加上2。
  • 当前元素为')',并且前面有元素且上一个元素为')',这种情况就要追溯到前面有效括号再之前的元素,如果前面有有效括号并且前面的有效括号前面是'(',这时当前元素前一个元素维护的值恰好记录的那个有效括号的长度,通过减去这个有效长度再减1(原本查看上一个元素也要减1,所以一共减2)就可以得到前面有没有相匹配的'(',于是就可以得到当前维护的数=前面有效括号的长度+2(若当前右括号与前面左括号相匹配)

状态转移方程如上。

cpp 复制代码
class Solution {
public:
    int longestValidParentheses(string s) {
        if(s.size()==0) return 0;
        vector<int> array(s.size()+1,0);
        int result=0;
        for(int i=2;i<=s.size();i++){
            if(s[i-1]=='(') array[i]=0;
            else if(s[i-2]=='('&&s[i-1]==')') array[i]=array[i-2]+2;
            else if(s[i-2]==')'&&s[i-1]==')'&&i>=array[i-1]+2&&s[i-array[i-1]-2]=='(') array[i]=array[i-array[i-1]-2]+array[i-1]+2;
            result=max(result,array[i]);
        }
        return result;
    }
};
相关推荐
Phoebe鑫7 分钟前
数据结构每日一题day15(链表)★★★★★
算法
奋进的小暄27 分钟前
数据结构(4) 堆
java·数据结构·c++·python·算法
珊瑚里的鱼1 小时前
LeetCode 102题解 | 二叉树的层序遍历
开发语言·c++·笔记·算法·leetcode·职场和发展·stl
_Djhhh1 小时前
【基础算法】二分查找的多种写法
java·数据结构·算法·二分查找
阳洞洞2 小时前
leetcode 59. 螺旋矩阵 II
leetcode·矩阵
王哥儿聊AI2 小时前
GenCLS++:通过联合优化SFT和RL,提升生成式大模型的分类效果
大数据·人工智能·深度学习·算法·机器学习·自然语言处理
xiaolang_8616_wjl2 小时前
c++_2011 NOIP 普及组 (1)
开发语言·数据结构·c++·算法·c++20
minji...2 小时前
C语言 指针(5)
c语言·数据结构·算法
Demons_kirit3 小时前
LeetCode 1007. 行相等的最少多米诺旋转 题解
算法·leetcode·职场和发展
n33(NK)3 小时前
【算法基础】插入排序算法 - JAVA
java·数据结构·算法·排序算法