将多个字符串的不同子字符串添加到 Treeset

addition of distinct substrings of multiple strings to a Treeset

问题 - 给你 n 个字符串 w1, w2, ......, wn。令 Si 表示通过考虑字符串 wi 的所有唯一子串而形成的字符串集。子字符串被定义为字符串中一个或多个字符的连续序列。可以在此处找到有关子字符串的更多信息。令 S = {S1 U S2 U .... Sn} .i.e S 是通过考虑所有集合 S1, S2, ..... Sn

中的所有唯一字符串而形成的一组字符串

我的方法 - 我使用 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)

谁能解释我为什么会收到这个运行时错误,我应该怎么做才能避免这个空指针异常以及为什么首先会发生这种情况?如果可以请帮助我

我们现在有很多记忆。但即使在过去,将同一个变量用于不同目的也被认为是一种不好的做法。将每一个用于一个目的,它会没事的。代码清晰易懂,不再有无法解释的异常:

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。家庭作业 - 使变量名称有意义且令人难忘。