2017-07-31 40 views
1

我与运行时错误(NZEC)上SPOJ的问题所困扰, http://www.spoj.com/problems/NHAY/提交代码是给运行时错误(NZEC)

我从我的身边试过很多情况下,每次它是给在正确的输出日食,但无法找出运行时错误的原因,同时提交此Spoj,任何人都可以请帮我解决这个错误。

这里是我的代码,

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; 

检查needlLengthnull之前要调用trim()

但似乎你至少有一个其他错误。你应该

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

更换

​​

,因为现在你顶多一个跳跃计算的前缀功能时做的,这是不正确的。