问题相关
问题描述
在开发SQL编辑器时,实现自动补全功能是提高用户体验的重要一环。小C需要实现一个功能,根据用户输入的字符片段,快速从已知的SQL关键字和数据库相关名称中找到所有以该片段开头的候选词,并按字典序输出。
例如,当用户输入 s 时,编辑器需要自动提示以 s 开头的所有可能选项,如 select。如果用户输入 fr,则需要提示 from 和 from_mobile。如果在提示中只有一个选项符合,如输入 from_ 时只提示 from_mobile。
输入描述
- num选项的个数
- data一个存放string类型的数组
返回
符合开头字母的所有选项
测试用例
- 样例1:
输入:num = 8,data = ["select", "from", "where", "limit", "origin_log_db", "event_log_table", "user_id", "from_mobile"], input = "f"
输出:'from,from_mobile' - 样例2
输入:num = 8,data = ["select", "from", "where", "limit", "origin_log_db", "event_log_table", "user_id", "from_mobile"], input = "wh"
输出:'where' - 样例3
输入:num = 8,data = ["select", "from", "where", "limit", "origin_log_db", "event_log_table", "user_id", "from_mobile"], input = "z"
输出:'-1'
解题思路
我们需要对于data中的每一个string进行遍历,然后通过substr的方式来进行前缀与input的判断,对符合要求的直接插入到容器中,在后续的提交代码过程中,出现了重复的选项,所以我们这里将存放符合结果的容器选择为set集合,起到一个自动去重的作用。
这里的前缀判断也同样可以使用find()函数进行前缀的判断,来检查字符串是否以input开头。
string join(const set<string>& vec, const string& delimiter) {
string result;
for (auto it = vec.begin(); it != vec.end(); ++it) {
if (it != vec.begin()) {
result += delimiter;
}
result += *it;
}
return result;
}
std::string solution(int num, std::vector<std::string> data, std::string input) {
// Please write your code here
set<string> res;
string result;
for (int i = 0; i < data.size(); i++) {
if (input == data[i].substr(0, input.size())) {
res.insert(data[i]);
}
}
if (res.empty()) return "-1";
return join(res, ",");
}
在得到集合中符合要求的字符串后,我们通过编写一个join函数完成在python中类似的效果,主要的方式就是通过对vec的遍历来对相邻的元素见插入","随后返回在最后返回result。最后我们对res进行判断,如果为空证明我们并没有碰到过符合要求的字符串,否则我们直接输出join()函数的结果。
总结
根据用户输入的字符片段,从已知的SQL关键字和数据库相关名称中找到所有以该片段开头的候选词,并按字典序输出。使用set存储匹配的字符串,自动去重并排序。遍历输入数据,检查每个字符串是否以输入片段开头,若是则插入set。最后,使用join函数将匹配结果连接成字符串,若无匹配则返回"-1"。