1346: 括号配对

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
****************************************************************/

猜你喜欢

转载自blog.csdn.net/qq_39507723/article/details/83856736
今日推荐