给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度
示例 1:
输入:s = "(()"
输出:2
解释:最长有效括号子串是 "()"
示例 2:
输入:s = ")()())"
输出:4
解释:最长有效括号子串是 "()()"
示例 3:
输入:s = ""
输出:0
解题思路
"0 1 2 3 4 5 6 7 8 9"
"( ( ) ) ) ( ) ) ) )"
//下标(0,1)的左括号入栈
[-1, 0, 1]
/**
* 1.下标(2)右括号和最后一个入栈的左括号(数值1)匹配,同时最后一个数据出栈
* 2.下标(2)右括号匹配成功后,计算字符串长度(下标相减 2 - 0 = 2),同时与上一个有效字符串长度对比
*/
[-1, 0] 2
/**
* 1.下标(3)右括号和最后一个入栈的左括号(数值0)匹配,同时最后一个数据出栈
* 2.下标(3)右括号匹配成功后,计算字符串长度(下标相减 3 - (-1) = 4),同时与上一个有效字符串长度对比
*/
[-1] 4
/**
* 1.下标(4)右括号,当前栈内没有可以匹配的左括号,即代表可能有新的有效字符串要重新生成
* 2.记录当前下标索引值,方便后期计算字符串长度
*/
[4]
/**
* 1.下标(5)的左括号入栈
*/
[4, 5]
/**
* 1.下标(6)右括号和最后一个入栈的左括号(数值5)匹配,同时最后一个数据出栈
* 2.下标(6)右括号匹配成功后,计算字符串长度(下标相减 6 - (4) = 2),同时与上一个有效字符串长度对比
*/
[4] 2
/**
* 1.下标(7)右括号,当前栈内没有可以匹配的左括号,即代表当前索引值后的字符串可能有新的有效字符串要重新生成
* 2.记录当前下标索引值,方便后期计算字符串长度
*/
[7]
/**
* 1.下标(8)右括号,当前栈内没有可以匹配的左括号,即代表当前索引值后的字符串可能有新的有效字符串要重新生成
* 2.记录当前下标索引值,方便后期计算字符串长度
*/
[8]
/**
* 1.下标(9)右括号,当前栈内没有可以匹配的左括号,即代表当前索引值后的字符串可能有新的有效字符串要重新生成
* 2.记录当前下标索引值,方便后期计算字符串长度
*/
[9]
最后返回max => 4
var longestValidParentheses = function (s) {
const stack = [-1]
let max = 0
for (let i = 0; i < s.length; i++) {
if (s[i] === '(') {
stack.push(i)
} else {
if (stack.length > 1) {
stack.pop()
max = Math.max(i - stack[stack.length - 1], max)
} else {
stack[0] = i
}
}
}
return max
};
longestValidParentheses("( ( ) ) ) ( ) ) ) )")
哎,这题确实有点难,尤其是写完之后,一看代码就这几行,总有股气郁结于胸啊!!!!