给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: “(()” 输出: 2 解释: 最长有效括号子串为 “()”
示例 2:
输入: “)()())” 输出: 4 解释: 最长有效括号子串为 “()()”
感觉动态规划很考验逻辑思维能力,没有什么固定的模板,状态转移方程逻辑性很强(这道题本菜鸡看题解的),本题代码量不多。在这里插入代码片
class Solution { public int longestValidParentheses(String s) { int length=s.length(); //if(s==null||s.length()==0) return 0; int[] dp=new int[length]; int max=0; for(int i=1;i<length;i++){ if(s.charAt(i)==')'){ if(s.charAt(i-1)=='('){ dp[i]=(i>1?dp[i-2]:0)+2; } else{ if(i-dp[i-1]-1>=0){ if(s.charAt(i-dp[i-1]-1)=='('){ dp[i]=(i-dp[i-1]-2>0?dp[i-dp[i-1]-2]:0)+dp[i-1]+2; } } } } max=Math.max(max,dp[i]); } return max; } }看不明白的话找样例手动跑遍就容易理解了。
此方法的难点是对右括号的处理,当匹配到右括号栈为空应当如何处理,官方题解解释的不够详细, 参考大佬的题解:大佬解释
public class Solution { public int longestValidParentheses(String s) { Deque<Integer> stack=new ArrayDeque<>(); int max=0; stack.addLast(-1); for(int i=0;i<s.length();i++){ if(s.charAt(i)=='('){ stack.addLast(i); } else{ stack.removeLast(); if(stack.isEmpty()){ stack.addLast(i); } else{ max=Math.max(max,i-stack.peekLast()); } } } return max; } }附上链接 题目描述
