问题描述:
有一个字符串序列 S,字符串 abc包含的不同子串有 a,b,c,ab,bc,abc
找出 S中字典序第 k小的子串 t,并将其输出。
注意:字符串 S 只包含小写字母!
例:
输入S为abc,k为2,
则子串t为a,b,c,ab,bc,abc
输出ab
注意:
-
set.toArray()
返回的是一个 Object 类型的数组,需要将其转换为 String 类型的数组才能输出。 -
若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;
});)