请问老师leetcode 642的思路

来源:10-7 更多和Trie字典树相关的话题

weixin_慕数据6497584

2019-07-30

老师您好,
在完成lc642这道题中,我想用trie来完成,想请问一下老师以下代码的思路是否正确,以及如何实现input这个函数?
谢谢老师!
class AutocompleteSystem {

private class Node {
    public int times;
    public Map<Character, Node> next;
    
    public Node(int times) {
        this.times = times;
        next = new HashMap<>()
    }
    
    public Node() {
        this(0);
    }
}

private Node root;

private void insert(String sentence, int times) {
    Node cur = root;
    for (int i = 0; i < sentence.length(); i++) {
        char c = sentence.charAt(i);
        if (cur.next.get(c) == null) {
            cur.next.put(c, new Node());
        }
        cur = cur.next.get(c);
    }
    cur.times = times;
}

public AutocompleteSystem(String[] sentences, int[] times) {
    root = new Node();
    for (int i = 0; i < sentences.length; i++) {
        insert(sentences[i], times[i]);
    }
    
}

public List<String> input(char c) {
    List<String> result = new ArrayList<>();
    
}

}

写回答

1回答

liuyubobobo

2019-07-31

基本思路:

以下讲解对照我的参考代码(C++实现):https://github.com/liuyubobobo/Play-Leetcode/blob/master/0642-Design-Search-Autocomplete-System/cpp-0642/main2.cpp


对所有初始词汇创建trie,对于句子的尾节点,记录这个句子出现的频次。(75-76行)


在 AutocompleteSystem 类中,需要创建一个字符串成员变量,比如叫cur,每次input一个新的字母,cur后面要添加上这个字母。(87行)

如果新输入的字母是'#',则把当前的句子cur加入到trie中,然后cur清空。(81-85行)


每次input,对当前cur,查找以当前cur为前缀的所有字符串。(88行)

查找的方法:首先,找到要查找的前缀的最后一个字母所在的节点(43-48行),

这个节点的所有子节点,都是以当前cur为前缀的字符串,用dfs的方式找到所有这些子节点对应的句子和对应的频次,这些句子就是备选答案。(50-52行)


4

对所有备选答案,按照题目规定的要求排序,先按照频次排,频次相同,按照字符串的字典序排。(89-93行)

然后,返回前三个。不足三个,就全部返回。(95-98行)


继续加油!:)

0
1
weixin_慕数据6497584
谢谢老师!
2019-07-31
共1条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程