一、题目解析:
问题描述
在开发SQL编辑器时,实现自动补全功能是提高用户体验的重要一环。需要实现一个功能,根据用户输入的字符片段,快速从已知的SQL关键字和数据库相关名称中找到所有以该片段开头的候选词,并按字典序输出。
例如,当用户输入 s 时,编辑器需要自动提示以 s 开头的所有可能选项,如 select。如果用户输入 fr,则需要提示 from 和 from_mobile。如果在提示中只有一个选项符合,如输入 from_ 时只提示 from_mobile。
输入
num: 关键字和数据库相关名称的数量data: 包含所有关键字和数据库相关名称的数组input: 用户输入的字符片段
返回
- 以输入片段开头的所有候选词,按字典序输出。如果没有符合的候选词,则返回
-1。
参数限制
- 1 <=
num<= 10^4 data中的每个字符串长度不超过 100input的长度不超过 100
题目思路
- 初始化变量:创建一个
TreeSet用于存储符合条件的候选词,并自动去重和排序。 - 遍历数据:遍历
data数组,检查每个字符串是否以input开头。 - 添加候选词:如果字符串以
input开头,则将其添加到TreeSet中。 - 生成结果:将
TreeSet中的元素按字典序拼接成一个字符串,返回结果。如果TreeSet为空,则返回-1。
具体操作步骤
-
初始化变量:
- 创建一个
TreeSet用于存储符合条件的候选词。
- 创建一个
-
遍历数据:
- 遍历
data数组,检查每个字符串是否以input开头。
- 遍历
-
添加候选词:
- 如果字符串以
input开头,则将其添加到TreeSet中。
- 如果字符串以
-
生成结果:
- 将
TreeSet中的元素按字典序拼接成一个字符串,返回结果。如果TreeSet为空,则返回-1。
- 将
代码实现
public static String solution(int num, String[] data, String input) {
int inputLength = input.length(); // 获取输入字符串的长度
String[] result = new String[num]; // 创建一个数组用于存储匹配的结果
int flag = 0; // 计数器,用于记录匹配的结果数量
// 查找匹配的字符串
for (String Ob : data) {
int isSub = 1; // 标志变量,初始值为1,表示当前字符串匹配
for (int i = 0; i < inputLength && i < Ob.length(); i++) {
// 如果当前字符不匹配,则设置标志变量为0,并退出循环
if (input.charAt(i) != Ob.charAt(i)) {
isSub = 0;
break;
}
}
// 如果字符串匹配并且长度大于等于输入字符串长度,则将其添加到结果数组中
if (isSub == 1 && Ob.length() >= inputLength) {
result[flag] = Ob;
flag++;
}
}
// 使用 TreeSet 去重并排序
TreeSet<String> set = new TreeSet<>();
for (int i = 0; i < flag; i++) {
set.add(result[i]);
}
// 将 TreeSet 转换为数组
String[] validResults = set.toArray(new String[set.size()]);
StringBuffer res = new StringBuffer();
flag = validResults.length; // 更新 flag 为有效结果的数量
if (flag == 0) {
res.append("-1"); // 如果没有匹配结果,返回 -1
}
for (int i = 0; i < flag; i++) {
res.append(validResults[i]); // 将有效结果添加到结果字符串中
if (i != flag - 1) {
res.append(","); // 在结果之间添加逗号
}
}
return res.toString(); // 返回最终结果字符串
}
二、知识总结:字符串操作和集合的应用
Java 中的 TreeSet 用法
-
特性:
TreeSet是一个有序的集合,基于红黑树实现,具有自动排序和去重功能。 -
常用方法:
add(E e): 将指定的元素添加到此集合中。isEmpty(): 如果此集合不包含任何元素,则返回true。iterator(): 返回此集合中元素的迭代器。
字符串操作
- 特性:字符串是不可变的字符序列,每次修改都会生成新的字符串对象。
- 实际应用:字符串操作常用于文本处理、数据解析等场景。
集合
- 特性:集合用于存储一组不重复的元素,常用于去重和快速查找。
- 实际应用:集合广泛应用于数据处理、算法实现等场景。
学习建议
- 多练习类似的题目:尝试解决更多涉及字符串操作和集合的问题,如“最长回文子串”、“字符串反转”等。
- 理解并手动推导:手动推导集合操作的过程,直观感受其工作原理和性能特点。
- 阅读相关文档和教程:深入学习字符串操作和集合的实现细节和使用方法。
通过这些方法,可以更好地掌握字符串操作和集合的应用,提升算法设计和实现的能力。