leetcode 32.最长有效括号
Posted chaha123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 32.最长有效括号相关的知识,希望对你有一定的参考价值。
题目:
给定一个只包含 ‘(‘
和 ‘)‘
的字符串,找出最长的包含有效括号的子串的长度。
分析:
这道题在我半年前开始学算法的时候有写过,不过最后绝对是被虐哭了,主要原因就是无法解决当你向下遍历字符串的时候,遇到隔断后再将其消除不能和上一个连续的有效字串合并。
现在在学了一些算法有了基本的功底后,我又来做这道题目了。
首先给出我参考的一个代码:
1 class Solution { 2 public int longestValidParentheses(String s) { 3 if(s==null||s.equals("")){ 4 return 0; 5 } 6 int maxLen = 0; 7 int[] flag = new int[s.length()]; 8 for(int i = 1;i<s.length();i++){ 9 if(s.charAt(i)==‘)‘){ 10 //寻找该‘)‘之前的最大匹配 11 if(i - flag[i - 1] - 1 >= 0&&s.charAt(i - flag[i - 1] - 1)==‘(‘){ 12 flag[i] = flag[i - 1] + 2; 13 } 14 //将前面不间断匹配加起来 15 if(i - flag[i] >= 0){ 16 flag[i] += flag[i - flag[i]]; 17 } 18 maxLen = flag[i]>maxLen?flag[i]:maxLen; 19 } 20 } 21 return maxLen; 22 } 23 }
这段代码转载自leetcode中文网第32题最长有效括号评论区的一位叫JessioJ的用户,不得不承认他的思想非常棒。
也就是从第二个字符开始遍历,当遇到‘)‘后开始判断,首先判断除去中间连续有效位数的前一位是否为‘(’,如果是就执行flag[i]=flag[i-1]+2操作。
然后开始判断隔断flag[i]位之前是否有连续的有效位数,如果有就使这两部分相加。
以下是我整理后的代码:
1 class Solution32 { 2 public int longestValidParentheses(String s) { 3 int len=s.length(); 4 if(len<2){ 5 return 0; 6 } 7 int max = 0; 8 int[] dp=new int[len]; 9 char[] sc=s.toCharArray(); 10 for(int n=1;n<len;++n) { 11 if(sc[n]==‘)‘&&n-dp[n-1]-1>=0) { 12 if(sc[n-dp[n-1]-1]==‘(‘) 13 dp[n]=dp[n-1]+2; 14 if(n-dp[n]>=0) 15 dp[n]+=dp[n-dp[n]]; 16 } 17 max=max>dp[n]?max:dp[n]; 18 } 19 return max; 20 } 21 }
如有特别的想法可留言评论区谢谢。
***第一段代码转载自leetcode中文网第32题最长有效括号评论区的一位叫JessioJ的用户
以上是关于leetcode 32.最长有效括号的主要内容,如果未能解决你的问题,请参考以下文章