Bootstrap

Day2 TreeSet 蓝桥3104.第k小子串

问题描述:

有一个字符串序列 S,字符串 abc包含的不同子串有 a,b,c,ab,bc,abc

找出 S中字典序第 k小的子串 t,并将其输出。

注意:字符串 S 只包含小写字母!

例:

输入S为abc,k为2,

则子串t为a,b,c,ab,bc,abc

输出ab


注意:

  1. set.toArray() 返回的是一个 Object 类型的数组,需要将其转换为 String 类型的数组才能输出。

  2. 若j取值为[0,S.length())或[i+1,S.length())会报段错误(产生的原因:访问不存在的内存地址、访问系统保护的内存地址 、访问只读的内存地址、空指针废弃(eg:malloc与free释放后,继续使用)、堆栈溢出、内存越界(数组越界,变量类型不一致等)),就是访问了不可访问的内存


代码:

import java.util.Scanner;
import java.util.TreeSet;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        TreeSet<String>set=new TreeSet<>();
        String S = scan.nextLine();
        int k = scan.nextInt();
        for (int i = 0; i < S.length(); i++) {
            for (int j = i+1; j <=Math.min(S.length(),i+k+1); j++) {
                set.add(S.substring(i, j));
            }
        }
        String[] list= set.toArray(new String[0]);
        System.out.println(list[k-1]);
        scan.close();
    }
}

TreeSet集合:

1、特点:

可排序、不重复、无索引

2、排序:
(1)默认排序:

Javabean类实现Comparable接口指定比较规则

(2)比较器排序:

创建TreeSet对象时,传递比较器Comparator指定规则

(由于该题比较器只是简单地调用了String类的compareTo方法,因此可以直接使用String类自带的比较器,而不需要自定义一个新的比较器。

TreeSet<String> set = new TreeSet<>()等同于

TreeSet<String>set=new TreeSet<>((o1,o2)-> {

int i=o1.compareTo(o2);

return i;

});)


;