LeetCode (32) Longest Valid Parentheses
2015-09-28 14:19
363 查看
题目
Given a string containing just the characters ‘(’ and ‘)’, find the length of the longest valid (well-formed) parentheses substring.For “(()”, the longest valid parentheses substring is “()”, which has length = 2.
Another example is “)()())”, where the longest valid parentheses substring is “()()”, which has length = 4.
分析
思路参考这道题可以用一维动态规划逆向求解。
假设输入括号表达式为String s,维护一个长度为s.length的一维数组dp[],数组元素初始化为0。 dp[i]表示从s[i]到s[s.length - 1]包含s[i]的最长的有效匹配括号子串长度。
则存在如下关系:
dp[s.length - 1] = 0;
i从n - 2 -> 0逆向求dp[],并记录其最大值。
若s[i] == ‘(‘,则在s中从i开始到s.length - 1计算dp[i]的值。这个计算分为两步,通过dp[i + 1]进行的(注意dp[i + 1]已经在上一步求解):
在ss中寻找从i+1i + 1开始的有效括号匹配子串长度,即dp[i+1]dp[i + 1],跳过这段有效的括号子串,查看下一个字符,其下标为j=i+1+dp[i+1]j = i +1 + dp[i + 1]。若jj没有越界,并且s[j]==‘)′s[j] == ‘)’,则s[i...j]s[i ... j]为有效括号匹配,dp[i]=dp[i+1]+2dp[i] =dp[i +1] + 2。
在求得了s[i...j]s[i ... j]的有效匹配长度之后,若j+1j + 1没有越界,则dp[i]dp[i]的值还要加上从j+1j + 1开始的最长有效匹配,即dp[j+1]dp[j + 1]。
AC代码
class Solution { public: int longestValidParentheses(string s) { if (s.empty()) return 0; //求括号字符串长度 int len = s.length(); //定义一个长度vector,i处值计量从i开始的到len-1长度字符串的最长有效匹配括号长度 vector<int> dp(len, 0); int maxlen = 0; for (int i = len - 2; i >= 0; --i) { if (s[i] == '(') { int j = i + 1 + dp[i + 1]; if (j < len && s[j] == ')') { dp[i] = dp[i + 1] + 2; if (j + 1 < len) dp[i] += dp[j + 1]; } } //实时求最长有效匹配长度 if (dp[i] > maxlen) maxlen = dp[i]; }//for return maxlen; } };
GitHub测试程序源码
相关文章推荐
- 网页修改标题栏图标
- unable to execute command:Segmentation fault:11
- php银行卡校验
- LeetCode (32) Longest Valid Parentheses
- Junit测试代码编写命名规范
- Android SharedPreferences Storage
- 问题:window7任务计划时;结果:Win7 下如何添加任务计划呢
- E. Kefa and Watch hash 线段树
- css基础---第一篇
- gitlab基本使用
- wireshark如何筛选协议包
- 已被否弃的结构,留个念想
- 详解Macbook虚拟机安装和使用
- HDU 3966 Aragorn's Story
- Oracle字符集碰到JAVA
- 也谈layout_gravity和gravity
- SQL SERVER 断开所有连接(转)
- 拜访:现在有一个城市销售经理,需要从公司出发,去拜访市内的商家。。。
- error C2653: “CXXXX”: 不是类或命名空间名称
- C++ 学习记录之静态变量static