1346: 括号配对
时间限制: 1 Sec 内存限制: 256 MB
题目描述
给出一串长度为n的括号序列(只包含小括号),计算出最少的交换(两两交换)次数,使整个括号序列匹配。
我们认为一个括号匹配,即对任意一个')',在其左侧都有一个'('与它匹配,且他们形成一一映射关系。
输入
第一行:一个整数T,表示测试实例个数
对于每组测试实例:
第一行:整数n(0≤n≤5×10^6 ),表示括号序列长度
第二行:一个字符串,表示括号
输出
每组测试实例输出一行:包含一个整数 ,表示最少的交换次数
样例输入
2 6 (()))( 6 )))(((
样例输出
1 2
思路:先递归去掉已经匹配的括号,然后剩下的字符串除以4,向上取整就好了,
例如:
初始字符串:(()))(
去掉一个括号,变成: ())(
去掉一个括号,变成:)(
最终结果为:2除以4,向上取整为1
代码实现:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int a[] = new int[n];//存放最终结果
for (int i = 0; i < a.length; i++) {
int t = sc.nextInt();
String s = sc.next();
s = f(s);
double b = s.length();
a[i] = (int)Math.ceil(b/4);
}
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
private static String f(String s) {
for (int i = 0; i < s.length()-1; i++) {
if(s.charAt(i)=='('&&s.charAt(i+1)==')') {
s = s.substring(0,i)+s.substring(i+2);
s = f(s);
break;
}
}
return s;
}
}
/**************************************************************
Problem: 1346
User: 20161514325
Language: Java
Result: 正确
Time:442 ms
Memory:23464 kb
****************************************************************/