最长括号化长度 java

 

1:求最长括号,

()(()()(  例如,它的最长符合括号化的长度为4 
package com.li.huawei;

import java.util.Arrays;
import java.util.Stack;

public class Question3 {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String input="()(()()(";
        System.out.println(longestValidTokens(input));
    }
    public static int  longestValidTokens(String input) {

        int[] arr = new int[input.length()];
        char[] inputArray=input.toCharArray();
        int length=inputArray.length;
        if(length==0)
            return 0;
        int validLength=0;
        int maxValidLength=0;
        Stack<Character> stack=new Stack<>();
        for(int i=0;i<length;i++){
            if(inputArray[i]==')')
            {
                if(stack.isEmpty())
                {
                    validLength=0;
                }
                else {
                    char tempPeek=stack.peek();
                    if(tempPeek=='(')
                    {
                        stack.pop();
                        validLength=validLength+2;
                        if (i - validLength >= 0) {
                            arr[i]=arr[i-1]+2+arr[i-validLength];  //动态规划,判断是否和上一个符合括号方案的括号是否相邻。
                        }else {
                            arr[i]=arr[i-1]+2;
                        }
                        maxValidLength=Math.max(maxValidLength, validLength);
                    }
                    else {
                        validLength=0;
                    }
                }
            } else {
                stack.push(inputArray[i]);
                validLength=0;
            }
        }

        Arrays.sort(arr);
        System.out.println(arr[arr.length-1]);
        return arr[arr.length-1];
    }

}

算法分析: 例如字符串

1:读取字符'('

到该位置的最长括号长度

2:读取字符')',  进行判断

   

到该位置的最长括号长度

3:挨个读取'((('

    

到该位置的最长括号长度

4:读取'(' 。

   

到该位置的最长括号长度

5:挨个读取'(('

到该位置的最长括号长度。

arr[i]=arr[i-1]+2+arr[i-validLength];  //动态规划,判断是否和上一个符合括号方案的括号是否相邻。
因为((()))是和前面的()是挨着的,所以,它们两个合一块也是符合括号化方案的。 所以应该将两个加在一起。

 

6:读取'('

  

到该位置的最长括号长度。

7:读取'('

到该位置的最长括号长度。

8:读取'('

到该位置的最长括号长度。

9:读取')'

到该位置的最长括号长度。

10  求出 数组中最大的值即为该最大化方案个数。

 

posted @ 2018-08-22 21:14  1367356  阅读(192)  评论(0编辑  收藏  举报