🌈【LeetCode 1268. 搜索推荐系统 】- JavaScript(排序+前缀)

175 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情


说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)

作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金

GitHub:P-J27、 CSDN:PJ想做前端攻城狮

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


【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可能出现重复的。所以我们在做题目时,真的得考虑全才行,这样的考虑不全的事情很容易发生。养成好习惯。👀🤞


感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。

写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤