试题 B: 不同子串
【问题描述】
一个字符串的非空子串是指字符串中长度至少为 1 的连续的一段字符组成
的串。例如,字符串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab,一共 7 个。
注意在计算时,只算本质不同的串的个数。
请问,字符串0100110001010001 有多少个不同的非空子串?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【分析】
基本思路是把字符串分解成各个子串,存储在一个“仓库”里面。每次往仓库里放
子串前需要先检查“仓库”里是否已经存在相同的子串,如果没有,则放进去。最后,
答案就是“仓库”里的子串数。
对于子串分解,有两个方法:
1.变换子串在母串中的起点和长度,之后分解。
2.变换子串在母串中的起点和终点,之后分解。
这里采用的是第一种方法。
【答案】
100
【代码】
import java.util.LinkedList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
String str = reader.next();//接受字符串0100110001010001
LinkedList<String> wareHouse = new LinkedList<String>();//仓库
for (int i = 1; i <= str.length(); i++) {//子字符串长度
for (int j = 0; j <= str.length()-i; j++) {//子字符串起点
String subStr = str.substring(j, j+i);
if (!wareHouse.contains(subStr)) {//检查“仓库”里是否已经存在相同的子串
wareHouse.add(subStr);
}
}
}
System.out.println(wareHouse.size());
}
}