在C++编程中,LeetCode是一个非常受欢迎的在线平台,用于练习和提升编程技能,特别是算法和数据结构。第32题"最长有效括号"是LeetCode中的一个经典问题,它涉及到字符串处理和动态规划的运用。在这个问题中,我们需要找到给定字符串中由匹配括号构成的最长有效(即没有嵌套)括号子串的长度。 题目描述: 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。有效括号子串应当满足以下条件:左右括号必须配对,且组成子串的括号不能嵌套。 例如,输入字符串 "(()",最长有效括号子串是 "()",长度为 2;输入字符串 ")()())",最长有效括号子串是 "()()",长度为 4。 解决这个问题的关键在于如何有效地检查每个可能的括号子串是否有效,并找到最长的一个。一种常用的解决方案是使用动态规划(Dynamic Programming, DP)。我们可以定义一个二维数组 `dp`,其中 `dp[i][j]` 表示从索引 `i` 开始到 `j` 结束的子串是否为有效括号子串。为了实现这个,我们可以遍历所有可能的子串,对于每个子串,我们检查它的最后一个字符是否与起始字符相匹配,以及去掉这两个字符后的子串是否有效。 具体步骤如下: 1. 初始化 `dp` 数组,将所有的 `dp[i][i]` 设置为 `true`,因为单个字符本身就是一个有效的括号。 2. 遍历字符串,对于每个索引 `i` 和 `j`,如果 `s[j]` 是右括号 ')',并且 `s[i]` 是左括号 '(',且 `dp[i+1][j-1]` 为 `true`,那么 `dp[i][j]` 就可以设置为 `true`,表示从 `i` 到 `j` 的子串有效。 3. 在遍历过程中,记录下当前找到的最长有效括号子串的长度。 4. 返回记录的最长有效括号子串的长度。 代码实现可以如下: ```cpp #include <string> #include <vector> int longestValidParentheses(std::string s) { if (s.empty()) return 0; int max_len = 0; std::vector<int> dp(s.size(), 0); for (int end = 1; end < s.size(); ++end) { if (s[end] == ')') { if (s[end - 1] == '(') { dp[end] = (end >= 2 ? dp[end - 2] : 0) + 2; } else if (end - dp[end - 1] > 0 && s[end - dp[end - 1] - 1] == '(') { dp[end] = dp[end - 1] + ((end - dp[end - 1]) >= 2 ? dp[end - dp[end - 1] - 2] : 0) + 2; } max_len = std::max(max_len, dp[end]); } } return max_len; } ``` 这段代码使用了滚动数组技巧来减少空间复杂度,只需要存储前一列的值即可。这个方法的时间复杂度为 O(n),空间复杂度为 O(1)。 在学习和解决这个问题时,你不仅会掌握C++的基础语法,还能深入理解动态规划的思想,这对提升算法和数据结构的技能非常有帮助。同时,解决LeetCode上的问题也有助于准备像Google、Facebook等公司的技术面试。通过不断地实践和挑战,你可以在编程领域更上一层楼。
- 1
- 粉丝: 3118
- 资源: 751
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助