一.题目描述
一个字符串的非空子串是指字符串中长度至少为1 的连续的一段字符组成的串。例如,字符串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab,一共7 个。注意在计算时,只算本质不同的串的个数。
请问,字符串0100110001010001 有多少个不同的非空子串?
二.代码
import java.util.HashSet;
import java.util.Set;
public class test1 {
public static void main(String[] args){
String s1 = "0100110001010001";
System.out.println(f(s1));//方法的调用
}
public static int f(String s){
Set<String> set = new HashSet<String>();//去掉重复的
for(int i=0;i<s.length();i++){
for(int j=i;j<s.length();j++){
set.add(s.substring(i,j+1));//截取字符串(注意:左闭右开)
}
}
return set.size();//返回截取字符串的个数
}
}
三.知识点
1.Set集合的使用
(1)特点:无序、无下标、元素不可重复
代码实现:
import java.util.Set;
import java.util.HashSet;
public class test1 {
public static void main(String[] args){
Set<String>set = new HashSet<String>();
//增加
set.add("小米");
set.add("华为");
set.add("苹果");
set.add("小米");
System.out.println(set.size());//输出:3 特点:去掉重复的
System.out.println(set.toString());//输出:[苹果, 华为, 小米] 特点:无序
//删除
set.remove("苹果");
System.out.println(set.size());//输出:2
System.out.println(set.toString());//输出:[华为, 小米]
//for循环遍历
for(String s :set){
System.out.print(s+" ");//输出:华为 小米
}
//判断
System.out.println(set.isEmpty());//输出:false
//查找,包含
boolean flag = set.contains("小米");//判断是否存在
System.out.println(flag);//输出:true(有存在指定元素)
//清空
System.out.println(set.isEmpty());//清除所有元素
}
}
(2)分类:Set有HashSet和TreeSet两种实现类。
HasSet【重点】
* 存储结构:哈希表(数组+链表+红黑树)
* 存储过程(重复依据)
1.根据hashCode计算保存的位置,如果位置为空,直接保存,若不为空,进行第二步
2.再执行equals方法,如果equals为true,则认为是重复,否则形成链
TreeSet:
特点:
1.基于排列顺序实现元素不重复
2.实现SortedSet接口,对集合元素自动排序
3.元素对象的类型必须实现Comparable接口,指定排序规则
4.通过CompareTo方法确定是否为重复元素
2.Set<String> 基础用法
Set是集合的意思,是同种对象的集合。
<String>说明这种对象都是String类型的对象。
Set本身是接口,所以需要实现,可以这样定义:
Set<String>set = new HashSet<String>();
3.subString的用法小结
subString常用方法一:
String a = “123456anbdc”;
String b = a.subString(1);
此时得到的为字符串a从下标为1的位置开始截取到最后的值,也就是23456anbdc;
subString常用方法二:
String a = “123456anbdc”;
String b = a.subString(1,5);
此时得到的为字符串a从下标为1的位置开始截取到下标为5的位置的值(不包括下标为5的值),左闭右开,也就是2345;
subString常用方法三:
String a = “123456anbdc”;
String b = a.subString(1,a.indexOf(“b”));
此时得到的为字符串a从下标为1的位置开始截取到指定字符串“b”的值(不包含b,也是左闭右开!),也就是23456an;
(注:如指定字符串有多个,以第一个为主)