15のマッチング括弧(B)
メモリ制限:64メガバイト 制限時間:1000msの 特殊な文を:いいえ
数によって:91の 提出:276 難易度:6
件名の説明:
あなたにだけ含まれている文字列を、与える「(」、「)」「[」、「]」の記号の4種類は、どのように多くのことは、あなたは括弧が一致し、少なくともこれらのブラケットを追加する必要があります。
例えば:
[]が一致している
([])[]が一致している
((]が一致していない
([)]ミスマッチであります
例えば:
[]が一致している
([])[]が一致している
((]が一致していない
([)]ミスマッチであります
説明を入力します。
最初の行は、正の整数Nを入力し、テストデータの数(N <= 10)を設定し 、各テストデータの唯一の行、上記4つだけの文字を含む文字列S、S、無長さSを有しています100以上
出力説明:
テストデータのセットごとに出力が追加されるブラケットの最小数を示す正の整数です。各試験の出力行
サンプル入力:
4 [] [] [] ((] ([)]
出力例:
0 0 。3 2
リファレンスLeetCode32最長有効括弧ソリューション。
メソッドを使用してLeetCode32最長の有効な括弧は、文字列は、治療のStringBufferを前提とした後、すべての完璧な文字列マッチングの部分文字列を削除します。この文字列に基づいて行うことがはるかに簡単になります。
D [i] [j]はサブストリングを表す[i、j)を用いて完全無サブストリングSの場合、ブラケットの最小数は、添加を必要とします。以下のような文字列は、(])のような別の決意を、必要とすることに留意されたい
状態遷移方程式は、次のとおり
1つの インポートjava.util.Scanner。 2 3 パブリック クラスメイン{ 4 静的 クラスソリューション{ 5 ブールマッチ(char型、チャーB){ 6 場合(A == '(' && B == '')|| == '[' && B == 「]」) 7 リターン 真。 8 返す 偽。 9 } 10 11 公共の INTは解決する(文字列S){ 12 であれば(s.length()<= 1)戻りs.length()。 13 INT [] [] D = 新しい INT [s.length()+ 1] [s.length()+ 1 ]。 14 15の ために(int型、iはs.lengthを()<; I = 0 iは++ ){ 16 dは[i]は[I] = 0 ; 17 D [i]は[I + 1] = 1 。 18 } 19 20 のために(INTのステップ= 2;ステップ<= s.length();ステップ++ ){ 21 のためには、(int型 i = 0; iが(s.lengthを<)&& iがステップ<s.length()+ 1 + ; I ++ ){ 22 であれば(一致(s.charAt(i)は、s.charAtは、(iステップを+ - 1 ))){ 23 D [i]は[Iステップ-1 + [I + 1] = D [iがステップを+] ]。 24 } 他{ 25 INT分= 65535 。 26 のための(int型 ; kは<私はステップを+; K = I + 1 kは++ ){ 27 分= Math.min(D [i]が[K] + D [k]は[I +は、分工程])。 28 } 29 D [I] = [iがステップを+] 分。 30 } 31 } 32 } 33 リターン D [0 ] [s.length()]。 34 } 35 } 36 37 [ パブリック 静的たStringBuffer deSubPerfect(文字列S){ 38である INT [] D = 新しい新しい INT [s.length()]; 39 int型の最大値= 0 ; 40 41である ため(INT。I <s.length; I = 1 (); iは++ ){ 42は // 最も完璧iが終了位置と一致見つける 43が INT LEN = 0 ; 44である IF [1-1](1-I-D> = 0 &&(s.charAt(I)== ')' && '(' == s.charAt(I - 1 - D [I - 1])|| s.charAt(I)== ']' && '[' == s.charAt(I-1 -d [-I 1]))){ // (()) 45 LEN = D [I-1] +2 。 46 } それ以外 の場合(!(s.charAt(I)== '')&& s.charAt(I-1)== '(')||!(s.charAt(I)== ']' && " [ '== s.charAt(I-1-D [I-1]))){ // ()) 47 LEN = 0 。 48 } 他 { // (()||() 49 LEN = 2 ; 50 } 51 52 なら!(I-LEN> = 0 && LEN = 0 ){ 53 D [I] = D [I-LEN] + LEN; LEN; 56 } 57 最大値=(MAX <D [I])?D [i]は:最大。 58 } 59 のStringBuffer S1 = 新規のStringBuffer(); 60 のためには、(int型 I = s.length() - 1; I> = 0; i-- ){ 61 、I = D [i]は、 62 もし(I> = 0 ) 63 s1.append(s.charAt(I))。 64 } 65 のStringBuffer =逆)(s1.reverse。 66 リターン逆。 67 } 68 69 パブリック 静的 ボイドメイン(文字列[]引数){ 70 のString = 新しい文字列()。 71 スキャナSC = 新しいスキャナ(System.in)。 72 ソリューションソリューション= 新しいソリューション()。 73 INT N = Integer.parseInt(sc.nextLine())。 74 のために(int型 i = 0; iがN <; Iは++ ){ 75 、S = sc.nextLine()。 76 のStringBufferのStringBuffer = deSubPerfect(S)。 77 78 INTは =解きますsolution.solve(stringBuffer.toString())。 79 のSystem.out.println(解きます)。 80 } 81 } 82 } 83 // ()(() 84 // (())(())