标签:longest mat 示例 bsp 实现 一个 integer long ++
暴力法
public class Solution { public boolean isValid(String s) { Stack<Character> stack = new Stack<Character>(); for (int i = 0; i < s.length(); i++) { if (s.charAt(i) == ‘(‘) { stack.push(‘(‘); } else if (!stack.empty() && stack.peek() == ‘(‘) { stack.pop(); } else { return false; } } return stack.empty(); } public int longestValidParentheses(String s) { int maxlen = 0; for (int i = 0; i < s.length(); i++) { for (int j = i + 2; j <= s.length(); j+=2) { if (isValid(s.substring(i, j))) { maxlen = Math.max(maxlen, j - i); } } } return maxlen; } }
暴力法也有可取之处,比如这处isValid就思路很明确
题解有个动态规划,不需要这么麻烦啊关键是。
栈实现
public static int longestValidParentheses(String s) { int maxans = 0; Stack<Integer> stack = new Stack<>(); stack.push(-1); // 这里相当于设置一个比较位置 for (int i = 0; i < s.length(); i++) { if (s.charAt(i) == ‘(‘) { stack.push(i); } else { stack.pop(); if (stack.empty()) { // 当为空的时候,说明已经出现了一种()())的情况,说明我们如果要继续下去只能从最后这个)开始作为一个新的起始点来比较 stack.push(i); } else { maxans = Math.max(maxans, i - stack.peek()); } } } return maxans; }
对于括号匹配直接想到的基本都是栈,因为学数据结构的时候这就是一个栈的经典示例,但是此题还有一个更直接的方法,不需要额外的空间
public 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; } } left = 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; } }
这个思路就是左到右,右到左直接的遍历处理,当不满足的时候置零是此思路的关键。
标签:longest mat 示例 bsp 实现 一个 integer long ++
原文地址:https://www.cnblogs.com/CherryTab/p/12194392.html