Offer_32 最长有效括号
给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
package com.lhb.offer; import java.util.Deque; import java.util.LinkedList; /** * @author lhb * @date 2022/3/15 */ public class Offer_32 { // stack static int solution_1(String s) { int ret = 0; Deque<Integer> st = new LinkedList<>(); st.push(-1); for (int i = 0; i < s.length(); i++) { if (s.charAt(i) == '(') { st.push(i); } else { st.pop(); if (st.isEmpty()) { st.push(i); } else { ret = Math.max(ret, i - st.peek()); } } } return ret; } // dp static int solution_2 (String s) { int[] dp = new int[s.length()]; int ret = 0; for (int i = 1; i < s.length(); i++) { if (s.charAt(i) == ')') { if ( s.charAt(i - 1) == '(') { dp[i] = (i >= 2) ? dp[i - 2] + 2 : 2; } else if (i - dp[i - 1] > 0 && s.charAt(i - dp[i - 1] - 1) == '(') { dp[i] = dp[i - 1] + ((i - dp[i - 1]) >= 2 ? dp[i - dp[i - 1] - 2] : 0) + 2; } } ret = Math.max(ret, dp[i]); } return ret; } // left right static int solution_3(String s) { int left = 0; int right = 0; int ret =0; for (int i = 0; i < s.length(); i++) { if (s.charAt(i) == ')') { right++; }else { left++; } if (left == right) { ret = Math.max(ret, 2 * right); } else if (right > left) { left =right = 0; } } left = right = 0; for (int i = s.length() - 1; i >= 0; i--) { if (s.charAt(i) == ')') { right++; }else { left++; } if (left == right) { ret = Math.max(ret, 2 * right); } else if (right < left) { left = right = 0; } } return ret; } public static void main(String[] args) { System.out.println(solution_1("(((()))))(()()()))))")); // 8 System.out.println(solution_2("(((()))))(()()()))))"));// 8 System.out.println(solution_3("(((()))))(()()()))))")); // 8 } }

浙公网安备 33010602011771号