import java.util.*;
/**
* NC323 括号区间匹配
* @author d3y1
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return int整型
*/
public int match (String s) {
return solution(s);
}
/**
* 动态规划
*
* dp[i][j]表示使字符串s子串[i,j](从第i个字符到第j个字符)所有括号左右配对最少需要插入的括号数
*
* // case 1: ([[]) -> (s.charAt(i-1)=='('&&s.charAt(j-1)==')') || (s.charAt(i-1)=='['&&s.charAt(j-1)==']')
* dp[i][j] = dp[i+1][j-1] , 1<=i<=n && i+1<=j<=n
* // case 2: ([])()
* dp[i][j] = Math.min(dp[i][j], dp[i][k]+dp[k+1][j]) , 1<=i<=n && i+1<=j<=n && i<=k<j
*
* @param s
* @return
*/
private int solution(String s){
int n = s.length();
int[][] dp = new int[n+1][n+1];
for(int i=n; i>0; i--){
dp[i][i] = 1;
for(int j=i+1; j<=n; j++){
dp[i][j] = Integer.MAX_VALUE;
// case 1: ([[])
if((s.charAt(i-1)=='('&&s.charAt(j-1)==')') || (s.charAt(i-1)=='['&&s.charAt(j-1)==']')){
dp[i][j] = dp[i+1][j-1];
}
// case 2: ([])()
for(int k=i; k<j; k++){
dp[i][j] = Math.min(dp[i][j], dp[i][k]+dp[k+1][j]);
}
}
}
return dp[1][n];
}
}