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.
该题使用动态规划思想
我首先想到的是利用一个二维数组来保存长度,二维数组的x,y为字符串下标,保存它们之间的子字符串的长度。
但是我无法找到一种简单的公式来表示大问题和小问题之间的关系,这种关系相当复杂,我找出了36种情况,并想一一列出,但发现36种之外还有其他情况。结果我就放弃了这种方法。
于是我到网上搜索了其他人的算法,发现居然只用一维数组就可以解决
这个一维数组的值含义是表示从s[i]到s[s.length - 1]包含s[i]的最长的有效匹配括号子串长度
说实话,这个含义并不容易想得到,如果我来思考的话,我首先想到不包含s[i]的最长有效匹配括号字串。是基于什么样的思路才得到这样的结果。为什么我就想不出来呢?我不相信是我的智商问题,一定是我做的题太少了。继续刷题吧,量变总会有质变的那一天。
int longestValidParentheses(string s) { int len = s.size(); if(len < 2) return 0; int maxLen = 0; int f[len]; for(int i = 0; i < len; ++i) // 初始化为0 f[i] = 0; for(int i = len-2; i >= 0; --i) { if(s[i] == '(') // 既然是包含s[i],那么s[i]必然是'('才能构成匹配括号 { int j = i + 1 + f[i+1]; // 下一个"也许"不能匹配的括号的位置 if(j < len && s[j] == ')') // 这个"也许"经检查可以匹配 { f[i] = f[i+1] + 2; if(j + 1 < len) // 当心如果后面还有匹配的括号的话长度要加上 f[i] += f[j+1]; } if(f[i] > maxLen) // 最大长度 maxLen = f[i]; } } return maxLen; }