最长括号化长度 java

时间:2023-03-09 07:04:14
最长括号化长度   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];
} }

算法分析: 例如字符串

最长括号化长度   java

1:读取字符'('

最长括号化长度   java

到该位置的最长括号长度

最长括号化长度   java

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

最长括号化长度   java

到该位置的最长括号长度

最长括号化长度   java

3:挨个读取'((('

最长括号化长度   java

到该位置的最长括号长度

最长括号化长度   java

4:读取'(' 。

最长括号化长度   java

到该位置的最长括号长度

最长括号化长度   java

5:挨个读取'(('

最长括号化长度   java

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

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

最长括号化长度   java

6:读取'('

最长括号化长度   java

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

最长括号化长度   java

7:读取'('

最长括号化长度   java

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

最长括号化长度   java

8:读取'('

最长括号化长度   java

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

最长括号化长度   java

9:读取')'

最长括号化长度   java

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

最长括号化长度   java

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