蓝桥杯JAVA B组 2019第二题 不同的子串

文章通过一个具体的例子解释了如何使用Java计算一个字符串的不同非空子串的数量,主要利用HashSet去重。代码中展示了Set集合的使用,特别是HashSet,它基于哈希表,用于存储无序且不重复的元素。同时,文章还介绍了substring方法在截取字符串中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.题目描述

     一个字符串的非空子串是指字符串中长度至少为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;
(注:如指定字符串有多个,以第一个为主)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值