LeetCode 642. 设计搜索自动补全系统(Trie树)

文章目录

    • 1. 题目
    • 2. 解题

1. 题目

为搜索引擎设计一个搜索自动补全系统。
用户会输入一条语句(最少包含一个字母,以特殊字符 ‘#’ 结尾)。
除 ‘#’ 以外用户输入的每个字符,返回历史中热度前三并以当前输入部分为前缀的句子。下面是详细规则:

  • 一条句子的热度定义为历史上用户输入这个句子的总次数。
  • 返回前三的句子需要按照热度从高到低排序(第一个是最热门的)。如果有多条热度相同的句子,请按照 ASCII 码的顺序输出(ASCII 码越小排名越前)。
  • 如果满足条件的句子个数少于 3,将它们全部输出。
  • 如果输入了特殊字符,意味着句子结束了,请返回一个空集合。

你的工作是实现以下功能:

构造函数:

  • AutocompleteSystem(String[] sentences, int[] times): 这是构造函数,输入的是历史数据。
    Sentences 是之前输入过的所有句子,Times 是每条句子输入的次数,你的系统需要记录这些历史信息。

现在,用户输入一条新的句子,下面的函数会提供用户输入的下一个字符:

  • List<String> input(char c): 其中 c 是用户输入的下一个字符。
    字符只会是小写英文字母(‘a’ 到 ‘z’ ),空格(' ')和特殊字符('#')。输出历史热度前三的具有相同前缀的句子。
样例 :
操作 : AutocompleteSystem(["i love you", 
"island","ironman", "i love leetcode"], 
[5,3,2,2])
系统记录下所有的句子和出现的次数:
"i love you" : 5"island" : 3"ironman" : 2"i love leetcode" : 2 次
现在,用户开始新的键入:输入 : input('i')
输出 : ["i love you", "island","i love leetcode"]
解释 :
有四个句子含有前缀 "i"。其中 "ironman""i love leetcode" 有相同的热度,
由于 ' ' 的 ASCII 码是 32'r' 的 ASCII 码是 114,
所以 "i love leetcode""ironman" 前面。
同时我们只输出前三的句子,所以 "ironman" 被舍弃。输入 : input(' ')
输出 : ["i love you","i love leetcode"]
解释:
只有两个句子含有前缀 "i "。输入 : input('a')
输出 : []
解释 :
没有句子有前缀 "i a"。输入 : input('#')
输出 : []
解释 :用户输入结束,"i a" 被存到系统中,后面的输入被认为是下一次搜索。

注释 :
输入的句子以字母开头,以 ‘#’ 结尾,两个字母之间最多只会出现一个空格。
即将搜索的句子总数不会超过 100。
每条句子的长度(包括已经搜索的和即将搜索的)也不会超过 100。
即使只有一个字母,输出的时候请使用双引号而不是单引号。
请记住清零 AutocompleteSystem 类中的变量,因为静态变量、类变量会在多组测试数据中保存之前结果。详情请看这里。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/design-search-autocomplete-system
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

class trie
{
public:unordered_map<char, trie*> next;string word;//记录单词int freq = 0;//是单词时,记录频数void insert(string& s, int time){trie *cur = this;for(int i = 0; i < s.size(); ++i){if(!cur->next.count(s[i]))cur->next[s[i]] = new trie();cur = cur->next[s[i]];}cur->word = s;cur->freq += time;}void find(trie* cur, vector<pair<int, string>> &freq_wd){if(!cur) return;if(cur->freq)//找到单词,存入候选集合freq_wd.push_back({cur->freq, cur->word});for(auto item : cur->next)find(item.second, freq_wd);}
};
class AutocompleteSystem {trie* t, *cur;string prefix;
public:AutocompleteSystem(vector<string>& sentences, vector<int>& times) {t = new trie();cur = t;for(int i = 0; i < sentences.size(); ++i)t->insert(sentences[i], times[i]);}vector<string> input(char c) {if(c == '#'){t->insert(prefix, 1);//单词记录+1次prefix = "";cur = t;return {};}else{prefix += c;if(!cur->next.count(c))cur->next[c] = new trie();cur = cur->next[c];vector<pair<int, string>> freq_wd;t->find(cur, freq_wd);sort(freq_wd.begin(), freq_wd.end(),[&](auto a, auto b){if(a.first == b.first)return a.second < b.second;return a.first > b.first;});//排序,取前3vector<string> ans;for(int i = 0; i < min(3, int(freq_wd.size())); ++i)ans.push_back(freq_wd[i].second);return ans;}}
};

1040 ms 238.7 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/474685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 动漫卡通人物图片大全_用Python把人物头像动漫化,不同的表情给你不同的惊喜...

前言最近上网冲浪的时候看到了一个有趣的东西&#xff0c;叫做『人物动漫化』&#xff0c;作为老大的粉丝&#xff0c;怎么可能放过这个机会&#xff0c;让我们先看看效果图&#xff1a;这就是这次要用Python搞的事情啦&#xff0c;我们会利用百度AI的人物动漫化技术&#xff0…

linux 命令学习记录

文件操作 chown -R user file 修改文件所有者chmod -R 777 file 修改文件权限wrxmkdir -p dir1/dir2/dir3 创建目录rmdir -p dir1/dir2/dir3 删除目录&#xff08;目录为空&#xff09;cp source target 复制source到targetcp -s source target 创建target 软链接到source &…

“后见之明”是冰冷刻薄的讥讽;这是一种病,得治。

我最讨厌的一类人就是&#xff0c;“嗯&#xff0c;我早就说过吧”、“你看&#xff0c;我没说错吧”。这不是高明&#xff0c;而是无耻无德无道无义。你早知 道为什么不说&#xff1f;你早发现为什么不阻止&#xff1f;你早有能耐为什么到现在才和我扯淡&#xff1f;“后见之明…

LeetCode MySQL 1264. 页面推荐(union)

文章目录1. 题目2. 解题1. 题目 朋友关系列表&#xff1a; Friendship ------------------------ | Column Name | Type | ------------------------ | user1_id | int | | user2_id | int | ------------------------ 这张表的主键是 (user1_id, use…

java从1开始计时用线程_java – Python – 线程,计时或函数使用?

我正在制定一个关于如何解决这个问题的想法.请帮忙.我的项目包含一个N x N网格,其中包含一系列块,这些块应该在随机方向和随机速度内移动(每隔0.1秒,块的位置用速度更新).我有三个“特殊”块,预计会有各自的移动功能.我将有其他块(其中许多)除了更新它们的位置之外什么都不做,并…

LeetCode MySQL 1070. 产品销售分析 III(group by 陷阱)

文章目录1. 题目2. 解题1. 题目 销售表 Sales&#xff1a; -------------------- | Column Name | Type | -------------------- | sale_id | int | | product_id | int | | year | int | | quantity | int | | price | int | -------------…

java中excel文件导入数据库中_〖JAVE经验〗java中Excel导入数据库里

1 从Excel文件读取数据表 Java Excel API既可以从本地文件系统的一个文件(.xls)&#xff0c;也可以从输入流中读取Excel数据表。读取Excel数据表的第一步是创建Workbook(术语&#xff1a;工作薄)&#xff0c;下面的代码片段举例说明了应该如何操作&#xff1a;(完整代码见Excel…

怎样在方框里打钩?

打开Microsoft Office Word 2003文档&#xff0c;鼠标单击菜单栏“插入”下拉菜单中的“符号”&#xff0c;选择“符号”对话框中的“符号”标签&#xff0c;在“字体”中选择“Wingdings 2”&#xff0c;即可在众多符号中找到“方框里面打钩的符号”。转载于:https://www.cnbl…

LeetCode MySQL 1364. 顾客的可信联系人数量

文章目录1. 题目2. 解题1. 题目 顾客表&#xff1a;Customers ------------------------ | Column Name | Type | ------------------------ | customer_id | int | | customer_name | varchar | | email | varchar | ------------------------ customer_…

JS控制锚点打开新窗口

在XHTML中不能含有TARGET&#xff0c;那么要使链接打开新窗口的话&#xff0c; 如果针对页面上所有锚点&#xff0c;JAVASCRIPT如下即可&#xff1a; function externalLinks() {if (!document.getElementsByTagName) return;var anchors document.getElementsByTagName("…

java showinputdialog_java - JOptionPane.showInputDialog中的多个输入

有没有一种方法可以在JOptionPane.showInputDialog中创建多个输入&#xff0c;而不是只创建一个输入&#xff1f;最佳答案&#xff1a;对。您知道可以将任何Object放入大多数Object的JOptionPane.showXXX methods参数中&#xff0c;并且经常会发现Object恰好是一个JPanel参数。…

LeetCode MySQL 602. 好友申请 II :谁有最多的好友(union all)

文章目录1. 题目2. 解题1. 题目 在 Facebook 或者 Twitter 这样的社交应用中&#xff0c;人们经常会发好友申请也会收到其他人的好友申请。 表 request_accepted 存储了所有好友申请通过的数据记录&#xff0c;其中&#xff0c; requester_id 和 accepter_id 都是用户的编号。…

用async 解放你的大脑

在js中&#xff0c;代码嵌套和代码回调非常常见&#xff0c;不仅编写麻烦而且异常反人类。让我等码农很是头痛 function () {function () {function () {function () {//pass}}} }这是一个常规的嵌套&#xff0c;如果每个function 的逻辑处理都比较多的话&#xff0c;会导致整个…

linux java 共享内存_Linux进程间通信之共享内存

一&#xff0c;共享内存内核管理一片物理内存&#xff0c;允许不同的进程同时映射&#xff0c;多个进程可以映射同一块内存&#xff0c;被多个进程同时映射的物理内存&#xff0c;即共享内存。映射物理内存叫挂接&#xff0c;用完以后解除映射叫脱接。1&#xff0c;共享内存的特…

LeetCode MySQL 1193. 每月交易 I(date_format)

文章目录1. 题目2. 解题1. 题目 Table: Transactions ------------------------ | Column Name | Type | ------------------------ | id | int | | country | varchar | | state | enum | | amount | int | | trans_date …

《大数据时代》摘录

本文内容摘自《大数据时代》&#xff0c;浙江人民出版社&#xff0c;2013年1月第1版。 引言 大数据并非一个确切的概念。最初&#xff0c;这个概念是指需要处理的信息量过大&#xff0c;已经超出了一般电脑在处理数据时所能使用的内存量&#xff0c;因此工程师们必须改进处理数…

java子类继承父类实际_java子类继承父类,是否生成父类对象?

从根本上来说&#xff0c;对象就是一个特殊结构的内存以及可以访问这块内存的代码。所以你这个问题其实就是一个到底如何看什么是对象的。我不了解现在jvm的具体实现&#xff0c;所以只能就理论上进行下分析。由于现代的编译器都可以对内存及其访问进行优化&#xff0c;所以&am…

LeetCode 1257. 最小公共区域(最小公共祖先)

文章目录1. 题目2. 解题1. 题目 给你一些区域列表 regions &#xff0c;每个列表的第一个区域都包含这个列表内所有其他区域。 很自然地&#xff0c;如果区域 X 包含区域 Y &#xff0c;那么区域 X 比区域 Y 大。 给定两个区域 region1 和 region2 &#xff0c;找到同时包含…

创建样式和样式表

css中的样式&#xff08;或者规则&#xff09;由两部分组成&#xff1a;选择器和声明块。每个声明块里面可以包含多条声明&#xff0c;它们之间由分号分隔。如下图所示&#xff1a; 链接外部样式表 外部样式表可以使网页打开的速度更快。但是浏览器在下载外部样式表的时候&…

java 程序输出 赵_编写一个完整的JAVA的程序

编写一个完整的JAVA的程序关注:84 答案:1 mip版解决时间 2021-02-05 08:43提问者妳螚鬧俄螚笑2021-02-05 02:591&#xff0c;接口Person Show()方法输出对象的描述信息。2.类Student 实现Person接口&#xff0c;另有以下属性和方法:属性(私有)String name。方法Student():构造…