🌟🌟🌟🌟🌟力扣算法——最长有效括号

331 阅读2分钟

给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度

示例 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("( ( ) ) ) ( ) ) ) )")

哎,这题确实有点难,尤其是写完之后,一看代码就这几行,总有股气郁结于胸啊!!!!