题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
一个字符串的非空子串是指字符串中长度至少为 11 的连续的一段字符组成的串。例如,字符串 aaab有非空子串 a,b,aa,ab,aaa,aab,aaab,一共 7 个。
注意在计算时,只算本质不同的串的个数。
请问,字符串0100110001010001 有多少个不同的非空子串?
运行限制
最大运行时间:1s
最大运行内存: 128M
求子串问题, 滑动窗口 的经典应用。我们只需要用Set对子串进行去重,把字符串的每一个子串都添加到Set里面即可。
参考文章:
//substring()的作用就是截取父字符串的某一部分 substring(a,b)中的参数a其值可以从索引值0开始,当a等于0时,则表示其从字符串的第一个字符开始算起,也就是其子字符串是包含第一个字符的,当然,你也可以从后续的其他字符开始;substring(a,b)中的参数b,其值最大可以为 父字符串的长度, 但并不包含索引值为b的那个字符。
代码:
import java.util.*;
public class Main {
public static void main(String[] args) {
//第一种:
String s="0100110001010001";
Set set = new HashSet();
for(int i=0;i<s.length();i++) {
for(int j=i+1;j<=s.length();j++) {
//是<= 因为下面的(i,j)左闭右开吗??,所以要到s.length才能取到最后一个,即length-1为下标的数
String substring = s.substring(i,j);//substring()的作用就是截取父字符串的某一部分
set.add(substring);
}
}
System.out.println(set.size());
//第二种:
Set<String> set = new HashSet<>();
String str = "0100110001010001";
int head = 0; //双指针
int tail = head+1;
while(head<str.length()) {//从左到右每个数依次作为第一个
String s = str.substring(head,tail);
set.add(s); //set可去重
tail++;
if(tail>str.length()) {//tail可以=str.length(这个索引其实没有元素了),因为subString不包含括号右边那个索引上的;当tail>str.length()时,最右边那个已经取不到了,所以要head++重新开始下一组
head++;
tail = head+1;
}
}
System.out.println(set.size());
}
}
答案:100