NYOJ 15-括号匹配(二)
作者:互联网
15-括号匹配(二)
内存限制:64MB 时间限制:1000ms 特判: No
通过数:91 提交数:276 难度:6
题目描述:
给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的
输入描述:
第一行输入一个正整数N,表示测试数据组数(N<=10) 每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100
输出描述:
对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组测试输出占一行
样例输入:
4 [] ([])[] ((] ([)]
样例输出:
0 0 3 2
参考LeetCode32 longest valid parentheses解法。
利用LeetCode32 longest valid parentheses的方法将字符串去掉所有最完美匹配的子串,假设处理后的子串为stringBuffer。在此串的基础上做会简单很多。
对于没有最完美子串的字符串 s 来说,使用d[i][j]表示子串[i,j)需要最少添加的括号数量。
状态转移方程为:
1 import java.util.Scanner; 2 3 public class NYOJ_15 { 4 static class Solution { 5 boolean match(char a, char b) { 6 if (a == '(' && b == ')' || a == '[' && b == ']') 7 return true; 8 return false; 9 } 10 11 public int solve(String s) { 12 if (s.length()<=1) return s.length(); 13 int[][] d = new int[s.length()+1][s.length()+1]; 14 15 for (int i = 0; i < s.length(); i++) { 16 d[i][i] = 0; 17 d[i][i + 1] = 1; 18 } 19 20 for (int step = 2; step <= s.length(); step++) { 21 for (int i = 0; i < s.length() && i+step<s.length()+1; i++) { 22 if (i + 1 <= i + step - 1 && d[i + 1][i + step - 1] == 0 && match(s.charAt(i), s.charAt(i + step - 1))) { 23 d[i][i + step] = 0; 24 } else if (match(s.charAt(i), s.charAt(i + step - 1))) { 25 d[i][i+step]=d[i+1][i+step-1]; 26 }else { 27 int min = 65535; 28 for (int k = i + 1; k < i + step; k++) { 29 min = Math.min(d[i][k] + d[k][i + step], min); 30 } 31 d[i][i + step] = min; 32 } 33 } 34 } 35 return d[0][s.length()]; 36 } 37 } 38 39 public static StringBuffer deSubPerfect(String s) { 40 int[] d = new int[s.length()]; 41 int max = 0; 42 43 for (int i = 1; i < s.length(); i++) { 44 //查找以i位置结尾的最完美匹配 45 int len = 0; 46 if (i-1-d[i-1]>=0 && (s.charAt(i) == ')' && '(' == s.charAt(i - 1 - d[i - 1]) || s.charAt(i)==']' && '['==s.charAt(i-1-d[i-1]))){// (()) 47 len=d[i-1]+2; 48 }else if (!(s.charAt(i)==')' && s.charAt(i-1)=='(') || !(s.charAt(i)==']' && '['==s.charAt(i-1-d[i-1]))){// ()) 49 len=0; 50 }else {// (() || () 51 len = 2; 52 } 53 54 if (i-len>=0 && len!=0){ 55 d[i]=d[i-len]+len; 56 }else { 57 d[i]=len; 58 } 59 max = (max < d[i]) ? d[i] : max; 60 } 61 StringBuffer s1 = new StringBuffer(); 62 for (int i = s.length()-1; i >= 0; i--) { 63 i-=d[i]; 64 if (i>=0) 65 s1.append(s.charAt(i)); 66 } 67 StringBuffer reverse = s1.reverse(); 68 return reverse; 69 } 70 71 public static void main(String[] args) { 72 String s = new String(); 73 Scanner sc = new Scanner(System.in); 74 Solution solution = new Solution(); 75 int n = Integer.parseInt(sc.nextLine()); 76 for (int i = 0; i < n; i++) { 77 s=sc.nextLine(); 78 StringBuffer stringBuffer = deSubPerfect(s); 79 80 int solve = solution.solve(stringBuffer.toString()); 81 System.out.println(solve); 82 } 83 } 84 } 85 //()(]() 86 //(())(())
标签:15,charAt,int,NYOJ,len,括号,&&,匹配 来源: https://www.cnblogs.com/yfs123456/p/10993913.html