持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情
说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)
作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【LeetCode 1268. 搜索推荐系统 】- JavaScript(排序+前缀)
题目描述
给你一个产品数组 products 和一个字符串 searchWord ,products 数组中每个产品都是一个字符串。
请你设计一个推荐系统,在依次输入单词 searchWord 的每一个字母后,推荐 products 数组中前缀与 searchWord 相同的最多三个产品。如果前缀相同的可推荐产品超过三个,请按字典序返回最小的三个。
请你以二维列表的形式,返回在输入 searchWord 每个字母后相应的推荐产品的列表。
示例 1:
输入:products = ["mobile","mouse","moneypot","monitor","mousepad"], searchWord = "mouse" 输出:[ ["mobile","moneypot","monitor"], ["mobile","moneypot","monitor"], ["mouse","mousepad"], ["mouse","mousepad"], ["mouse","mousepad"] ] 解释:按字典序排序后的产品列表是 ["mobile","moneypot","monitor","mouse","mousepad"] 输入 m 和 mo,由于所有产品的前缀都相同,所以系统返回字典序最小的三个产品 ["mobile","moneypot","monitor"] 输入 mou, mous 和 mouse 后系统都返回 ["mouse","mousepad"]
排序+前缀
思路分析:
整体的的思路:前缀树的思想,对于每个字母节点中 加一个
tree[w]["cur_word"]=[word], 如果已经存在就append(word)。但是这题的坑在:如果返回结果>1,就要排序按字典序输出,如果超过三个就返回前3个。题目故意误导超过3个才排序。所以我们先将products数组按照字典序排序,保证符合题目的要求:"如果前缀相同的可推荐产品超过三个,请按字典序返回最小的三个"。然后通过substring截取searchWord前i个单词,与products中每个单词的前i个进行匹配。
- 若相等,将单词加入结果中,如果当前结果集有了三个单词,直接返回。
- 如果不相等,对该单词做标记,以后不再访问。因为如果前i个字符都不相等,后面的字符一定不相等。
- 如果products中某个字符串的长度 < searchWord.length() 那么在截取字符串的时候可能需要特殊处理。
var suggestedProducts = function (products, searchWord) {
let res = [];
products.sort();
for (let i = 0, len = searchWord.length; i < len; ++i) {
let temp = [];
products.forEach(product => {
if (product[i] === searchWord[i]) {
temp.push(product)
}
})
products = temp;
res.push(products.length > 3 ? products.slice(0, 3) : products);
}
return res;
};
思考
题目还有一个坑点,没考虑到就会踩坑,爬坑要爬很久。products可能出现重复的。所以我们在做题目时,真的得考虑全才行,这样的考虑不全的事情很容易发生。养成好习惯。👀🤞
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。
写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤