问题描述
在开发SQL编辑器时,实现自动补全功能是提高用户体验的重要一环。小C需要实现一个功能,根据用户输入的字符片段,快速从已知的SQL关键字和数据库相关名称中找到所有以该片段开头的候选词,并按字典序输出。
例如,当用户输入 s 时,编辑器需要自动提示以 s 开头的所有可能选项,如 select。如果用户输入 fr,则需要提示 from 和 from_mobile。如果在提示中只有一个选项符合,如输入 from_ 时只提示 from_mobile。
测试样例
样例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'
样例4:
输入:num = 8,data = ["select", "from", "where", "limit", "origin_log_db", "event_log_table", "user_id", "from_mobile"], input = "origin"
输出:'origin_log_db'
解题思路
构造前缀树:利用前缀树插入、查找
Java代码
import java.util.ArrayList;
import java.util.List;
public class Main {
static class Trie {
static class TrieNode {
TrieNode[] children;
boolean isEnd;
public TrieNode() {
this.children = new TrieNode[75];
this.isEnd = false;
}
}
TrieNode root;
public Trie() {
root = new TrieNode();
}
public void insert(String word) {
TrieNode trieNode = root;
for (char c : word.toCharArray()) {
int index = c - '0';
if (trieNode.children[index] == null) {
trieNode.children[index] = new TrieNode();
}
trieNode = trieNode.children[index];
}
trieNode.isEnd = true;
}
public TrieNode findPrefix(String prefix) {
TrieNode trieNode = root;
for (char c : prefix.toCharArray()) {
int index = c - '0';
if (trieNode.children[index] == null) {
return null;
}
trieNode = trieNode.children[index];
}
return trieNode;
}
public List<String> search(String prefix) {
TrieNode prefixNode = findPrefix(prefix);
List<String> list = new ArrayList<>();
if (prefixNode != null) {
dfs(prefixNode, new StringBuilder(prefix), list);
}
return list;
}
private void dfs(TrieNode trieNode, StringBuilder sb, List<String> list) {
if (trieNode.isEnd) {
list.add(sb.toString());
}
for (int i = 0; i < 75; i++) {
if (trieNode.children[i] != null) {
sb.append((char) ('0' + i));
dfs(trieNode.children[i], sb, list);
sb.delete(sb.length() - 1, sb.length());
}
}
}
}
public static String solution(int num, String[] data, String input) {
// Please write your code here
Trie trie = new Trie();
for (String s : data) {
trie.insert(s);
}
List<String> search = trie.search(input);
if (search.isEmpty()) {
return "-1";
} else {
return String.join(",", search);
}
}
public static void main(String[] args) {
// You can add more test cases here
String[] testData1 = { "select", "from", "where", "limit", "origin_log_db", "event_log_table", "user_id",
"from_mobile" };
System.out.println(solution(8, testData1, "f").equals("from,from_mobile"));
System.out.println(solution(8, testData1, "wh").equals("where"));
System.out.println(solution(8, testData1, "z").equals("-1"));
}
}
5148

被折叠的 条评论
为什么被折叠?



