题目描述:
题解:
public class LongestValidParentheses { /** * 解法一:暴力解法,超时了 * 从最大长度的字串,判断字串是否是合格的,如果是,那么当前字串长度就是结果 * @param s * @return */ public int longestValidParentheses2(String s) { int len = s.length(); Stack<Character> stack = new Stack<>(); String subStr; boolean flag = true; for (int k = len; k >= 1; k--) { for (int i = 0; i+k-1 < len; i++) { subStr = s.substring(i,i+k); stack.clear(); flag = true; for (int j = i; j < i+k; j++) { if (s.charAt(j) == '(') { stack.push(s.charAt(j)); } else { if (stack.isEmpty()) { flag = false; break; } else { stack.pop(); } } } if (flag && stack.isEmpty()) { return k; } } } return 0; } /** * 用栈模拟一遍,将所有无法匹配的括号的位置全部置0 * 例如: "()(()"的mark为[1, 1, 0, 1, 1] * 再例如: ")()((())"的mark为[0, 1, 1, 0, 1, 1, 1, 1] * 经过这样的处理后, 此题就变成了寻找最长的连续的1的长度 * @param s * @return */ public int longestValidParentheses3(String s) { if (s == null || s.isEmpty()) return 0; int len = s.length(); Stack<Integer> stack = new Stack<>(); int[] tag = new int[len]; for (int i = 0; i < len; i++) { if (s.charAt(i) == '(') { stack.push(i); } else { if (!stack.isEmpty()) { tag[stack.pop()] = 1; tag[i] = 1; } } } int pre = tag[0]; int result = 0, flag = 0; if (pre == 1) { flag++; } for (int i = 1; i < len; i++) { System.out.print(tag[i] + " "); if (pre == tag[i]) { if (pre == 1) { flag++; } } else { pre = tag[i]; if (pre == 0) { result = Math.max(result,flag); flag = 0; } else { flag++; } } } result = Math.max(result,flag); return result; } public int longestValidParentheses(String s) { if (s == null || s.isEmpty()) return 0; int len = s.length(); Stack<Character> stack = new Stack<>(); int tag = 0, result = 0, flag = 0; for (int i = 0; i < len; i++) { if (s.charAt(i) == '(') { stack.push(s.charAt(i)); if (tag > 0) { flag++; if (flag > 1) { result = Math.max(result,tag); tag = 0; } } else { flag = 0; } } else { if (!stack.isEmpty()) { stack.pop(); tag += 2; } } } if (tag > 0) { result = Math.max(result,tag); tag = 0; } return result; } }