32. 最长有效括号

简介: 32. 最长有效括号

题目

给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。

示例 1:

输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

一、解题思路

看见最长子串问题,我们可以考虑以i位置为结尾,能扩到最远的距离
在这一题中,我们可以使用这种思路
我们用一个pre变量,记录上一个最长有效括号的最左边界的上一个位置,
当i来到某个位置,有2种情况
1)i位置与pre位置不匹配,dp[i]=0;
2)i位置与pre位置匹配,dp[i]=dp[pre-1]+2

二、代码

class Solution {
    public int longestValidParentheses(String s) {
        char[] cha=s.toCharArray();
        int n=cha.length;
        if(s==null||n<2){
            return 0;
        }
        int res=0;
        int[] dp=new int[n];
        for(int i=1;i<n;i++){
            int pre=i-dp[i-1]-1;
            if(pre>=0&&cha[pre]=='('&&cha[i]==')'){
                dp[i]=dp[i-1]+2+((pre>0)?dp[pre-1]:0);
            }
            res = Math.max(res, dp[i]);
        }
        return res;
    }
}

总结

看到最长子串问题我们需要想到以i位置结尾或者开头,分析邻近位置与i的关系,推出动态规划公式

相关文章
|
2月前
|
存储 索引
|
2月前
|
存储
【字符串】最长不含重复字符的子字符串
【字符串】最长不含重复字符的子字符串
|
2月前
|
存储
【题型总结】寻找满足字符出现奇数次/偶数次的子串个数或者子串最长长度
【题型总结】寻找满足字符出现奇数次/偶数次的子串个数或者子串最长长度
52 0
|
2月前
|
算法 测试技术 C#
【线段树】2213. 由单个字符重复的最长子字符串
【线段树】2213. 由单个字符重复的最长子字符串
|
2月前
|
索引
leetcode-1624:两个相同字符之间的最长子字符串
leetcode-1624:两个相同字符之间的最长子字符串
25 0
LeetCode-32 最长有效括号
LeetCode-32 最长有效括号
|
算法 安全 Swift
LeetCode - #32 最长有效括号(Top 100)
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
剑指offer 49. 最长不含重复字符的子字符串
剑指offer 49. 最长不含重复字符的子字符串
50 0
每日三题-有效的括号、最长有效括号、最小栈
每日三题 有效的括号 最长有效括号 最小栈
82 6
每日三题-有效的括号、最长有效括号、最小栈
每日三题-无重复字符的最长子串、最长连续序列、找到字符串中所有字母异位词
每日三题 无重复字符的最长子串 最长连续序列 找到字符串中所有字母异位词
79 1
每日三题-无重复字符的最长子串、最长连续序列、找到字符串中所有字母异位词