【leetcode】32.(Hard)Longest Valid

题目链接


解题思路:
这道题的意思就是在在一串左右括号中,找到最长匹配的连续括号子串长度。
比如:
()(()))))   最长的有效子串长度是6
()(((((((())   最长的有效子串长度是4

我的想法是DP,但是是不完全的DP。
首先建立一个数组mark[]。

例如,对于 ()(())))):

下标 0 1 2 3 4 5 6 7 8
字符串 ( ) ( ( ) ) ) ) )
mark值 -1 1 -1 -1 1 2 -1 -1 -1

从下标为0到下标8的顺序计算mark值
所有的左括号mark值都是-1,遇到右括号则判别以当前右括号为尾的有效子串个数是多少
最后返回最长有效子串个数的2倍(长度)


提交代码:

class Solution {
    public int longestValidParentheses(String s) {
    	int mark[]=new int[50000];
    	int maxlen=0;
    	
    	for(int i=0;i<s.length();i++) {
    		if(s.charAt(i)=='(')
    			mark[i]=-1;
    		else {
    			if(i==0)	mark[i]=-1;
    			
    			else if(i>0&&s.charAt(i-1)=='(') {  //()
    				mark[i]=1;
    				if(i>2&&mark[i-2]>0)  //()()
    					mark[i]=mark[i-2]+1;
    				if(mark[i]>maxlen)	maxlen=mark[i];
    			}
    			
    			else if(mark[i-1]==-1)	mark[i]=-1;   //))))
    		
    			else if(i>0&&s.charAt(i-1)==')') {
    			int leftpos=i-2*mark[i-1]-1;
    			if(leftpos>=0&&s.charAt(leftpos)=='(') {  //(())
    				mark[i]=mark[i-1]+1;
    			leftpos=i-2*mark[i];
    			if(leftpos>=0&&mark[leftpos]>0)  //()(())
    				mark[i]+=mark[leftpos];

    			if(mark[i]>maxlen)	maxlen=mark[i];
    			}
    			else mark[i]=-1;
    			}
    			else	mark[i]=-1;
    			}
    		}
    	return maxlen*2;
    } 
}

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/AXIMI/article/details/83957547