LeetCode热题100—— 32. 最长有效括号 (hard)
https://leetcode.cn/problems/longest-valid-parentheses/description/?envType=study-plan-v2&envId=top-100-liked
给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = “(()”
输出:2
解释:最长有效括号子串是 “()”
示例 2:
输入:s = “)()())”
输出:4
解释:最长有效括号子串是 “()()”
示例 3:
输入:s = “”
输出:0
题解
字符串 | 左括号个数 | 右括号个数 | 最长有效括号数 |
---|---|---|---|
() | 1 | 1 | 2 |
()() | 2 | 2 | 4 |
(()) | 2 | 2 | 4 |
(())() | 3 | 3 | 6 |
(((() | 4 | 1 | 2 |
()))) | 1 | 4 | 2 |
- 字符串从左往右遍历 -> 左括号找右括号
- 如果左括号数大于右括号数,说明未完待续,还有可能出现对称的")", 继续遍历
- 如果左括号数小于右括号数,说明出现了一个害群之马破坏了队形,例如 “())” 多出来的")"导致无法继续有效,因此整个 "())"的区域被废弃,重新计算,左括号数 = 右括号数 = 0
- 如果左右括号数相同,说明是有效的,maxLength = max(maxLength , 2 * 左括号数)
- 字符串从右往左遍历 -> 右括号找左括号
- 如果右括号数大于左括号数,说明未完待续,还有可能出现对称的"(", 继续遍历
- 如果右括号数小于于左括号数,说明出现了一个害群之马破坏了队形,例如 “(()” 多出来的"("导致无法继续有效,因此整个 “(()” 的区域被废弃,重新计算,左括号数 = 右括号数 = 0
- 如果左右括号数相同,说明是有效的,maxLength = max(maxLength , 2 * 左括号数)
- 1和2取最大值即为 max
class Solution {public int longestValidParentheses(String s) {int left = 0, right = 0, maxlength = 0;for (int i = 0; i < s.length(); i++) {if (s.charAt(i) == '(') {left++;} else {right++;}if (left == right) {maxlength = Math.max(maxlength, 2 * right);} else if (right > left) {left = right = 0;}}// 注意要重置为0left = right = 0;for (int i = s.length() - 1; i >= 0; i--) {if (s.charAt(i) == '(') {left++;} else {right++;}if (left == right) {maxlength = Math.max(maxlength, 2 * left);} else if (left > right) {left = right = 0;}}return maxlength;}
}