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 求出 数组中最大的值即为该最大化方案个数。
本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究