Given a string containing just the characters '('
and ')'
, find the length of the longest valid (well-formed) parentheses substring.
Example 1:
Input: "(()"
Output: 2
Explanation: The longest valid parentheses substring is "()"
Example 2:
Input: ")()())
" Output: 4 Explanation: The longest valid parentheses substring is"()()"
这题的难点是判断字符串的合法是否终止,一开始我就只往这个方向去想,结果发觉有点难
看来Discuss里的讨论,才发现可以换个思路,我们先把可以合并的全部合并抵消,那么剩下的就是无法合并的,我们用stack来记录s里字符的下标,那么合并到最后,stack里的值就是无法消除的元素的下标,它们和0以及s的长度就形成了一段一段的差值就像0, st[0], .... , s.length, 那么我们只要求出这几个数中最大的相邻的差值就是答案了
下面是JS代码
/**
* @param {string} s
* @return {number}
*/
var longestValidParentheses = function(s) {
let st = []
let len = s.length
for(let i = 0;i < len ; i ++) {
if(st.length) {
if(s[i] === ')') {
if(s[st[st.length - 1]] === '(') {
st.pop()
}else st.push(i)
}else {
st.push(i)
}
}else {
st.push(i)
}
}
let stLen = st.length
console.log(st)
if(!stLen) return len
let ans = 0
let a, b
for(let i = 1; i < stLen; i ++) {
ans = Math.max(st[i] - st[i - 1] - 1, ans)
}
ans = Math.max(st[0] - 0, ans)
ans = Math.max(len - st[stLen - 1] - 1, ans)
return ans
};