当前位置:网站首页>leetcode:642.设计搜索自动补全系统
leetcode:642.设计搜索自动补全系统
2022-04-22 18:58:00 【OceanStar的学习笔记】
题目来源
题目描述

题目解析
根据题意:
- 补全的句子是按照之前出现的频率排列的,高频率的在最上面
- 如果频率向他,就按照字母顺序来显示
规则:
- 每输入一个字符,就返回自动补全的句子
- 如果遇到
#,表示完整句子结束
分析:
- 因为需要记住频率,那么就肯定需要一个hashmap,建立句子和其出现频率的映射
- 还需要一个字符串 data,用来保存之前输入过的字符
在构造函数 AutocompleteSystem(vector<string> sentences, vector<int> times)
- 参数是:历史输入的句子和句子历史输入的次数
- 因此:需要将其加入hashmap,然后data初始化为空字符串
在 vector<string> input(char c)函数中:
- 先判断输入字符是否为
#- 如果是的话,那么就表示当前的data字符串已经是一个完成的句子了,在hashmap中次数加1,并且data清空,返回空集
- 如果不是的话,将当前字符加入data字符串中,然后去找包含data前缀的前三高频句子。
- 关于:找包含data前缀的前三高频句子?遍历 hashmap ,
- 先看前缀是否匹配,如果匹配,那么将这个 pair 加入优先队列中
- 怎么验证当前 data 字符串是否是其前缀呢?没啥好的方法,只能逐个字符比较
- 要找前三高频句子,可以使用优先队列来做,
- 优先队列设计思路是:
- 始终用优先队列保存频率最高的三个句子
- 应该把频率低的后缀字母顺序大的放在队首,以便随时可以移出队列,所以应该是个最小堆,队列元素是
pair<句子,句子的频率>,并且根据其频率大小进行排序,要重写优先队列的 comparator。
- 如何保持保存频率最高的三个句子?
- 将pair加入优先队列之后,如果发现此时队列中的元素大于三个,那把队首元素移除,因为是最小堆,所以频率小的句子会被先移除
- 优先队列设计思路是:
- 先看前缀是否匹配,如果匹配,那么将这个 pair 加入优先队列中
- 怎么返回结果?优先队列保存着频率最高的三个数字,频率低的在最前面,所以先先出队列的是频率小的句子,所以要加到结果 res 的末尾
class AutocompleteSystem {
public:
AutocompleteSystem(vector<string> sentences, vector<int> times) {
for (int i = 0; i < sentences.size(); ++i) {
freq[sentences[i]] += times[i];
}
data = "";
}
vector<string> input(char c) {
if (c == '#') {
++freq[data];
data = "";
return {
};
}
data.push_back(c);
auto cmp = [](pair<string, int>& a, pair<string, int>& b) {
return a.second > b.second || (a.second == b.second && a.first < b.first);
};
priority_queue<pair<string, int>, vector<pair<string, int>>, decltype(cmp) > q(cmp);
for (auto f : freq) {
bool matched = true;
for (int i = 0; i < data.size(); ++i) {
if (data[i] != f.first[i]) {
matched = false;
break;
}
}
if (matched) {
q.push(f);
if (q.size() > 3) q.pop();
}
}
vector<string> res(q.size());
for (int i = q.size() - 1; i >= 0; --i) {
res[i] = q.top().first; q.pop();
}
return res;
}
private:
unordered_map<string, int> freq;
string data;
};
版权声明
本文为[OceanStar的学习笔记]所创,转载请带上原文链接,感谢
https://blog.csdn.net/zhizhengguan/article/details/124349469
边栏推荐
- 一份数据满足所有数据场景?腾讯云数据湖解决方案及DLC内核技术介绍
- 线性回归简洁实现
- stream演示
- 【最佳实践】巡检项:内容分发网络(CDN)开启URL鉴权
- MacOS M1 使用 Homebrew 安装 Mysql
- 【洛谷】P2372 yyy2015c01挑战算周长(BFS)
- jsp学习(八.JDBC与文件上传处理的项目)
- 【自我救赎--牛客网Top101 4天刷题计划】 第一天 热身运动
- Im instant messaging development how to design a database that can support millions of concurrent users
- 华为设备配置策略路由引流到旁挂防火墙
猜你喜欢
随机推荐
RHCE-ansible
学习编程过程中感觉很有趣,为什么到单独去做项目就不知道从何下手?
Why can't async be used directly in useeffect
TypeScript中的命名空间使用
CVPR2022 | 跨模态检索的协同双流视觉语言预训练模型
P1794 solving many fish problem
Small LED screen / digital alarm clock display screen / LED billboard / temperature digital display and other LED nixie tube display driver ic-vk1640 / 1640B sop28 / ssop24 package
描述文件中的全局类型
青训营-刷题打卡-控制并发执行goroutine的数量
JSP learning (VIII. JDBC and file upload processing project)
Cross chain asset interaction -- how to transfer KSM on Moonriver
深圳大学课题组发布《深圳市可持续发展评估报告(2016-2021年)》
华为设备配置策略路由引流到旁挂防火墙
为什么不能直接在 useEffect 中使用 async
【洛谷】P2372 yyy2015c01挑战算周长(BFS)
Flink 最佳实践:TDSQL Connector 的使用(上)
C#与 Halcon 联合编程
Server side password encryption
2020-11-04 go test compiled into executable file
被删除的相片能恢复吗?3个技巧恢复被删除的相片









