MarsCode刷题--73. SQL代码补全功能

问题描述

在开发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"));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值