NYOJ 15-ブレースマッチング(B)

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  // (())(())

 

 

 

おすすめ

転載: www.cnblogs.com/yfs123456/p/10993913.html