2017-07-31 3 views
1

私は問題のSpoj上のランタイムエラー(NZEC)に苦しんでいますを与えています日食が、Spojでこれを送信している間にランタイムエラーの理由を知ることができなかった、誰でもこのエラーを解決するために助けてください。ここでコードの提出は<a href="http://www.spoj.com/problems/NHAY/" rel="nofollow noreferrer">http://www.spoj.com/problems/NHAY/</a></p> <p> が、私は私の側から非常に多くの例を試してみましたが、毎回それが正しい出力を与えている、ランタイムエラー(NZEC)

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 
import java.util.List; 

class KMP { 

    public int[] lps(String needle, int needleLength) 
    { 
     int lps[] = new int[needleLength]; 

     int j=0,i=1;   
     lps[0]=0; 

     while(i<needle.length()) 
     { 
      if(needle.charAt(j) == needle.charAt(i)) 
      { 
       lps[i] = j+1; 
       i++; 
       j++; 
      } 
      else 
      { 
       if(j != 0) 
       { 
        j = lps[j-1]; 
       } 

       lps[i] = 0; 
       i++; 
      } 
     } 

     return lps; 
    } 

    public List<Integer> KMPalgo(String hayStack, String needle, int needleLengh) 
    { 
     int lps[] = lps(needle, needleLengh); 

     int i=0; 
     int j=0; 
     List<Integer> position = new ArrayList<Integer>(); 

     while(i<hayStack.length()) 
     {  
      if(hayStack.charAt(i) == needle.charAt(j)) 
      { 
       i++; 
       j++; 
      } 
      else 
      { 
       if(j !=0) 
       {     
        j = lps[j-1]; 
       } 
       else 
        i++; 
      } 

      if(needle.length() == j) 
      { 
       position.add(i-j); 
       if(j !=0)    
        j = lps[j-1]; 
      } 
     } 

     return position; 
    } 

    public static void main(String[] args) throws NumberFormatException, IOException { 

     KMP o = new KMP(); 
     BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); 

     while(true) 
     { 
      String needlLength = bf.readLine().trim(); 

      if(needlLength == null || needlLength.equals("")) 
       break; 

      int lNeedle = Integer.parseInt(needlLength); 
      String needle = bf.readLine().trim(); 
      String haystack = bf.readLine().trim(); 

       List<Integer> result= o.KMPalgo(haystack, needle, lNeedle); 
       System.out.println(); 

       for(Integer itr : result) 
        System.out.println(itr); 
     } 
} 
} 

答えて

1

、私のコードで実行時エラーの原因は次のとおりです。

String needlLength = bf.readLine().trim(); 

if(needlLength == null || needlLength.equals("")) 
    break; 

あなたはnullためneedlLengthをチェックする前trim()を呼んでいます。

少なくとも1つの他のエラーがあるようです。今プレフィックス関数を計算するときに最大で1回のジャンプでやっている、それは正しくないので、あなたは

if(j != 0) 
{ 
    j = lps[j-1]; 
} 
else 
{ 
    lps[i] = 0; 
    i++; 
} 

​​

を交換する必要があります。

関連する問題

 関連する問題