[leetcode/lintcode 题解] 阿里算法面试真题:最长有效括号

简介: [leetcode/lintcode 题解] 阿里算法面试真题:最长有效括号

描述
有一些原木,现在想把这些木头切割成一些长度相同的小段木头,需要得到的小段的数目至少为k。给出一个只包含'(' 和')'的字符串,找出其中最长的左右括号正确匹配的合法子串。

在线评测地址:领扣题库官网

样例1
输入: "(()"
输出: 2
解释: 最长有效括号子串为 "()"
样例2
输入: ")()())"
输出: 4
解释: 最长有效括号子串为 "()()"

考点

  • dp

题解
一般对于最长XX问题容易想到利用DP求解,在这题中利用逆向DP,设状态dpi为从i到len - 1中,以i开头的最长合法子串长度:

  • 初始化:dplen - 1= 0
  • 如果si= ')',则跳过,因为不可能有由'('开头的串
  • 如果si= '(',则需要找到右括号和它匹配,可以跳过以i + 1开头的合法子串,则需要看j = i + dpi + 1+ 1是否为右括号。如果没越界且为右括号,那么有dpi= dpi + 1+ 2,此外在这个基础上还要将j + 1开头的子串加进来(只要不越界)
class Solution {
public:
    int longestValidParentheses(string s) 
    {
        if(s.size() <= 1)   return 0;
        int res = 0;
        vector<int> dp(s.size(), 0);    //初始化
        for(int i = s.size() - 2; i >= 0; i--)
        {
            if(s[i] == '(')                                //如果s[i] = '(',则需要找到右括号和它匹配,可以跳过以i + 1开头的合法子串,则需要看j = i + dp[i + 1] + 1是否为右括号
            {
                int j = i + dp[i + 1] + 1;
                if(s[j] == ')' && j < s.size())        //如果没越界且为右括号
                {
                    dp[i] = dp[i + 1] + 2;
                    if(j + 1 < s.size())  //还要将j + 1开头的子串加进来
                        dp[i] += dp[j + 1];
                }    
                res = max(res, dp[i]);
            }
        }
        return res;
    }
};

更多题解参考:九章官网solution

相关文章
|
存储 关系型数据库 MySQL
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
|
监控 Java 数据安全/隐私保护
阿里面试:SpringBoot启动时, 如何执行扩展代码?你们项目 SpringBoot 进行过 哪些 扩展?
阿里面试:SpringBoot启动时, 如何执行扩展代码?你们项目 SpringBoot 进行过 哪些 扩展?
|
10月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
负载均衡 架构师 Cloud Native
阿里面试:服务与发现 ,该选 CP 还是 AP?为什么?
阿里面试:服务与发现 ,该选 CP 还是 AP?为什么?
阿里面试:服务与发现 ,该选  CP 还是 AP?为什么?
|
SQL Java 数据库连接
阿里腾讯互联网公司校招 Java 面试题总结及答案解析
本文总结了阿里巴巴和腾讯等互联网大厂的Java校招面试题及答案,涵盖Java基础、多线程、集合框架、数据库、Spring与MyBatis框架等内容。从数据类型、面向对象特性到异常处理,从线程安全到SQL优化,再到IOC原理与MyBatis结果封装,全面梳理常见考点。通过详细解析,帮助求职者系统掌握Java核心知识,为校招做好充分准备。资源链接:[点击下载](https://pan.quark.cn/s/14fcf913bae6)。
611 2
|
算法 Go 索引
【LeetCode 热题100】回溯:括号生成 & 组合总和(力扣22 / 39 )(Go语言版)
本文深入解析了LeetCode上的两道经典回溯算法题:**22. 括号生成**与**39. 组合总和**。括号生成通过维护左右括号数量,确保路径合法并构造有效组合;组合总和则允许元素重复选择,利用剪枝优化搜索空间以找到所有满足目标和的组合。两者均需明确路径、选择列表及结束条件,同时合理运用剪枝策略提升效率。文章附有Go语言实现代码,助你掌握回溯算法的核心思想。
611 0
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
479 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
583 2