请问老师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回答
-
基本思路:
以下讲解对照我的参考代码(C++实现):https://github.com/liuyubobobo/Play-Leetcode/blob/master/0642-Design-Search-Autocomplete-System/cpp-0642/main2.cpp
1
对所有初始词汇创建trie,对于句子的尾节点,记录这个句子出现的频次。(75-76行)
2
在 AutocompleteSystem 类中,需要创建一个字符串成员变量,比如叫cur,每次input一个新的字母,cur后面要添加上这个字母。(87行)
如果新输入的字母是'#',则把当前的句子cur加入到trie中,然后cur清空。(81-85行)
3
每次input,对当前cur,查找以当前cur为前缀的所有字符串。(88行)
查找的方法:首先,找到要查找的前缀的最后一个字母所在的节点(43-48行),
这个节点的所有子节点,都是以当前cur为前缀的字符串,用dfs的方式找到所有这些子节点对应的句子和对应的频次,这些句子就是备选答案。(50-52行)
4
对所有备选答案,按照题目规定的要求排序,先按照频次排,频次相同,按照字符串的字典序排。(89-93行)
然后,返回前三个。不足三个,就全部返回。(95-98行)
继续加油!:)
012019-07-31
相似问题