1. 程式人生 > >1346: 括號配對

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