1346: 括號配對
阿新 • • 發佈:2018-11-11
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 ****************************************************************/