贪心算法判定对称条件。
给你一个只包含 ‘(‘ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = “(()” 输出:2 解释:最长有效括号子串是 “()”
思路: 我们可以遍历每个字符。分别记录正括号和反括号的数量 left 和 right。当两个数字相等时,即可判断整个子串有效,更新最大子串长度。而当右括号的数量较大时,我们就可以将两个数字置 0,因为多余的右括号出现在最右时,左侧的子串已经不能构成合法的字符串。 这种考虑有个瑕疵,就是当左侧有很多多余的左括号时,我们的 right 永远小于 left,即使遍历到字符串末尾也无法统计出有效子串长度。此时我们只需反向遍历字符串,将前面的判断规则镜像处理,以左括号数量超越右括号为重置条件。
时间复杂度:O(n) 空间复杂度:O(1)
实现: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 class Solution { public int longestValidParentheses (String s) { int len = s.length(); int left = 0 , right = 0 ; int maxCount = 0 ; for (int i = 0 ; i < len; i++) { if (s.charAt(i) == '(' ) { left++; } else { right++; } if (left != 0 && left == right) { maxCount = Integer.max(maxCount, left << 1 ); } if (right > left) { right = 0 ; left = 0 ; } } left = 0 ; right = 0 ; for (int i = len - 1 ; i >= 0 ; i--) { if (s.charAt(i) == '(' ) { left++; } else { right++; } if (left != 0 && left == right) { maxCount = Integer.max(maxCount, left << 1 ); } if (left > right) { right = 0 ; left = 0 ; } } return maxCount; } }