2015-05-16 56 views
2

問題 - 給出n個字符串w1,w2,......,wn。設Si表示通過考慮字符串wi的所有唯一子串形成的字符串集合。子字符串被定義爲字符串中一個或多個字符的連續序列。有關子字符串的更多信息可以在這裏找到。令S = {S1 U S2 U ... Sn} .ie S是考慮所有集合中的所有唯一字符串形成的一組字符串,S1,S2,...... Sn將多個字符串的不同子串添加到Treeset中

我的方法 - I我正在使用TreeSet並直接填充它,而不是創建列表,集合和排序列表。

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 cases = Integer.parseInt(in.nextLine()); 
    String[] a = new String[cases]; 
    int i, c; 

//Adding directly to the Set prevents a larger list because you remove the duplicates 
Set<String> set = new TreeSet<String>(); 

    for(i = 0; i < cases; i++) 
    { 
     a[i] = in.nextLine(); 
      for (c = 0; c < a[i].length(); c++) 
     { 
      for (i = 1; i <= a[i].length() - c; i++) 
      { 
       String sub = a[i].substring(c, c + i); 
       set.add(sub); 
      } 
     } 

    } 
    } 

輸入:

2 
aab 
aac 

我得到一個運行時錯誤:

Exception in thread "main" java.lang.NullPointerException 
at Solution.main(Solution.java:32) 

任何人都可以解釋我爲什麼我收到此運行時錯誤,我應該做些什麼來避免這種空指針異常,爲什麼這首先發生?請幫助我,如果你可以

+0

你可能想檢查最後一次迭代i'i' – silentprogrammer

+0

會發生什麼,i = a [i] .length() - c的值,它有什麼問題? @singhakash – coder101

+1

在你初始化'a [0]'的最外層循環的第一次迭代中,你在這裏訪問'a [1] .length()'的最內循環'a [1]'沒有被初始化給你空指針。爲什麼你有相同的變量名稱嵌套循環 – silentprogrammer

回答

2

現在我們有很多內存。但即使是過去,爲不同目的使用相同的變量也被認爲是不好的做法。爲了一個目的使用每一個目的,它會沒事的。代碼是清晰的,不可解釋的,除了無法解釋的例外:

import java.io.StringReader; 
import java.util.Scanner; 
import java.util.Set; 
import java.util.TreeSet; 

public class Solution { 

    public static void main(String[] args) { 
     Scanner in = new Scanner(new StringReader("2\naab\naac\n")); 

     int cases = Integer.parseInt(in.nextLine()); 
     String[] a = new String[cases]; 
     //int i, c; 

     // Adding directly to the Set prevents a larger list because you remove 
     // the duplicates 
     Set<String> set = new TreeSet<String>(); 

     for (int i = 0; i < cases; i++) { 
      a[i] = in.nextLine(); 
      for (int c = 0; c < a[i].length(); c++) { 
       for (int ii = 1; ii <= a[i].length() - c; ii++) { 
        String sub = a[i].substring(c, c + ii); 
        set.add(sub); 
       } 
      } 
     } 
     System.out.println(set); 
    } 
} 

P.S.家庭作業 - 使變量的名稱有意義且難以形容。

相關問題