问题 - 给你n个字符串w1,w2,......,wn。设Si表示通过考虑字符串wi的所有唯一子串而形成的字符串集。子字符串被定义为字符串中一个或多个字符的连续序列。有关子串的更多信息,请参见此处。设S = {S1 U S2 U .... Sn}。是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)
任何人都可以解释我为什么我得到这个运行时错误,我应该怎么做才能避免这个空指针异常,为什么这首先出现?如果可以,请帮帮我
答案 0 :(得分: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。家庭作业 - 使变量名称有意义且难以辨认。