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 求出 数组中最大的值即为该最大化方案个数。