2016-05-14 9 views
0

私のコードは最初の2つのテストケースを通過していますが、3番目のテストケースは失敗しています。誰か助けてもらえますか?java(hackerrank)のタグコンテンツ抽出プログラムで何が問題になっていますか?

リンク:https://www.hackerrank.com/challenges/tag-content-extractor

問題文:XMLやHTMLなどのタグベースの言語で

、内容が開始タグと終了タグの間で囲まれています。対応する終了タグは/で始まることに注意してください。

  1. 開始と終了の名前:タグベースの言語のテキストの文字列を、このテキストを解析し、以下の基準を満たすよく組織タグの配列内に囲まれた内容を取得を考える

    タグは同じでなければなりません。

  2. タグは入れ子にすることができますが、ネストされたタグ間の内容は、有効な

  3. タグは任意の印刷可能文字で構成することができないと考えられます。

入力形式:

入力の最初の行は、単一の整数、N(行数)を含みます。 N個の後続の行にそれぞれ1行のテキストが含まれます。

制約:

  • 1 <= N <= 100

  • 各行は10000印刷可能な文字の最大が含まれています。

  • すべてのテストケースの合計文字数は、1000000を超えません。

出力フォーマット:各行の

、有効なタグで囲まれたコンテンツを印刷します。 行に有効なコンテンツのインスタンスが複数含まれている場合は、有効なコンテンツの各インスタンスを新しい行に出力します。有効なコンテンツが見つからない場合は、Noneを出力します。

マイコード:

import java.io.*; 
import java.util.*; 
import java.text.*;  
import java.math.*; 
import java.util.regex.*; 

public class Solution { 
public static void main(String[] args) { 
    Scanner in = new Scanner(System.in); 
    int testCases = Integer.parseInt(in.nextLine()); 

    while(testCases > 0) { 
     String line = in.nextLine(); 
     char[] A = line.toCharArray(); 
     String tag = "", tag1 = ""; 
     int a1 = 0, b1 = 0; 
     int a = 0, b = 0; 
     int flag = 0, end = 0; 

     a = line.indexOf('<', a1); 
     b = line.indexOf('>', b1); 
     //System.out.println("Index of first '<' is " + a); 
     //System.out.println("Index of first '>' is " + b); 

     while ((a != -1) && (b != -1) && b < line.lastIndexOf(">")) { 
      tag = ""; 
      tag1 = ""; 
      //System.out.println("Index of first '<' is " + a); 
      //System.out.println("Index of first '>' is " + b); 
      for (int k = a + 1; k < b; k++) 
       tag = tag + A[k]; 
      //System.out.println("tag is " + tag); 

      a1 = line.indexOf('<', a + 1); 
      b1 = line.indexOf('>', b + 1); 

      if (A[a1+1] == '/') { 
       //System.out.println("Index of second '<' is " + a1); 
       //System.out.println("Index of second '>' is " + b1); 
       for (int k = a1 + 2; k < b1; k++) 
        tag1 = tag1 + A[k]; 
       if ((!tag.isEmpty()) && (!tag1.isEmpty())) {  
        if (tag.equals(tag1)) { 
         if ((b + 1) == a1) { 
          System.out.println("None"); 
          flag = 1; 
         } else { 
          for (int k = b + 1; k < a1; k++) 
           System.out.print(A[k]); 
          System.out.println(); 
          flag = 1; 
         } 
        } else if (flag == 0) { 
         System.out.println("None"); 
         flag = 1; 
        } 
       } 
      } 
      a = a1; 
      b = b1; 
      //System.out.println("tag1 is " + tag1); 
     } 
     if ((b == -1 || a == -1 || tag1.isEmpty() || tag.isEmpty()) && (flag == 0)) { 
      System.out.println("None"); 
     } 
     testCases--; 
    } 
} 
} 

EDIT:テストケース#3のために、私はそれが持っているのに対し大きいという文字列が行ずつ解析されます理由のために問題をデバッグすることはできませんよパラグラフ全体を解析する!もしそれが全体として解析されたら、私は出力を正しく得るでしょう。

+4

をさて、あなたはデバッガでコードの各行をステップ実行しましたか?あなたのプログラムをデバッグする方法を学ぶことは、Javaを学ぶことと同じくらい重要です。私はそれにある程度の時間を費やすだろう。 – OldProgrammer

+0

これを今すぐ学び、あなたの提案をありがとう。 @schwobaseggl - コードを編集していただきありがとうございます。 – Swaggerboy

答えて

1

あなたはここでそれを得ることができます:

import java.io.*; 
import java.util.*; 
import java.text.*; 
import java.math.*; 
import java.util.regex.*; 
public class Solution{ 
public static void main(String[] args){ 
    Scanner in = new Scanner(System.in); 
    int testCases = Integer.parseInt(in.nextLine()); 
    while(testCases>0){ 

     String line=in.nextLine(); 
     int cur=0; 
     boolean none=true; 
     for(;;){ 
      int start=line.indexOf("<",cur); 
      if(start<0)break; 
      int end=line.indexOf(">",start); 
      if(end<0)break; 
      String tag=line.substring(start+1,end); 
      if(tag.length()==0 || tag.charAt(0)=='/'){ 
       cur=end+1; 
       continue; 
      } 
      int brk=line.indexOf("</"+tag+">"); 
      if(brk>=0){ 
       String output=line.substring(end+1,brk); 
       if(output.length()>0 && output.indexOf("<")<0){ 
        none=false; 
        System.out.println(output); 
       } 
      } 
      cur=end+1; 
     } 
     if(none)System.out.println("None"); 
     testCases--; 
    } 
    } 
} 
関連する問題