题目抽象:给你一个括号字符串,要求你加入最好的括号使得括号匹配。输入匹配后的括号字符串。
分析:由已知的子区间推出大的区间。 cnt[i][j]表示原字符串[i,j]中至少需要加入的括号数。 ans[i][j]存储原字符串[i,j]匹配后的字符串。
特别注意输入的是空字符串。空字符串是匹配的字符串。
1 import java.util.*; 2 import java.io.*; 3 import java.math.*; 4 5 public class Main 6 { 7 static Scanner cin = new Scanner(new BufferedInputStream(System.in)); 8 public final static int MS= 105; 9 static int[][] cnt = new int[MS][MS]; 10 static String[][] ans = new String[MS][MS]; 11 12 13 public static void main(String[] args) 14 { 15 String str = cin.nextLine(); 16 str.replaceAll(" ",""); 17 if(str.length() == 0) 18 { 19 System.out.println(); 20 System.exit(0); 21 } 22 char[] ch = str.toCharArray(); 23 int len = ch.length; 24 25 for(int i = 0 ;i<len;i++) 26 for(int j = i;j< len;j++) 27 cnt[i][j] = Integer.MAX_VALUE; 28 for(int i = 0;i<len;i++) 29 Arrays.fill(ans[i], ""); 30 31 for(int i = len -1;i>=0;i--) 32 { 33 for(int j = i;j<len;j++) 34 { 35 if(i == j) 36 { 37 cnt[i][j] = 1; 38 if(ch[i] == ‘(‘ || ch[i] == ‘)‘) 39 ans[i][i] = "()"; 40 else 41 ans[i][i] = "[]"; 42 } 43 else 44 { 45 if(ch[i] == ‘(‘ && ch[j] == ‘)‘) 46 { 47 if(cnt[i+1][j-1] < cnt[i][j]) 48 { 49 cnt[i][j] = cnt[i+1][j-1]; 50 ans[i][j] = "(" + ans[i+1][j-1] + ")"; 51 52 } 53 } 54 else if(ch[i] == ‘[‘ && ch[j] == ‘]‘) 55 { 56 if(cnt[i+1][j-1] < cnt[i][j]) 57 { 58 cnt[i][j] = cnt[i+1][j-1]; 59 ans[i][j] = "[" + ans[i+1][j-1] + "]"; 60 } 61 } 62 // 求 cnt[i][j]的最小值。 63 for(int k = i;k<j;k++) 64 { 65 if(cnt[i][k] + cnt[k+1][j] < cnt[i][j]) 66 { 67 cnt[i][j] = cnt[i][k] + cnt[k+1][j]; 68 ans[i][j] = ans[i][k] + ans[k+1][j]; 69 } 70 } 71 } 72 } 73 } 74 System.out.println(ans[0][len-1]); 75 } 76 }
时间: 2024-10-17 07:59:48