青训营 X 豆包MarsCode 技术训练营 | 豆包MarsCode AI 刷题 | 73.SQL代码补全功能

41 阅读2分钟

问题相关

问题描述

在开发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"