逐步实现前缀匹配:LeetCode 搜索推荐系统题解与详解

问题描述

我们需要设计一个推荐系统,它接受一个产品数组和一个搜索词。每当用户输入一个字母时,系统应该返回与当前输入前缀匹配的最多三个产品。如果匹配的产品超过三个,则按字典序返回最小的三个。

1268. 搜索推荐系统 - 力扣(LeetCode)

问题拆解

在设计这个推荐系统时,我们的任务是实现一个产品推荐功能:在用户输入每个字母时,根据当前的输入词前缀找出符合条件的前三个产品,并按字典序排列。这个问题可以拆解为几个小步骤,分别处理:

  1. 对产品进行排序,使它们在字典序排列。
  2. 构建搜索前缀:当用户每次输入一个字母时,逐步构成当前的前缀。
  3. 查找匹配产品:根据当前前缀,找到符合要求的最多三个产品。
  4. 存储并输出结果:将每次匹配的推荐产品存储在结果列表中。

详细解决方案和实现步骤

1. 对产品进行排序

我们使用 sort() 函数对产品数组进行排序。这样,在后续查找时可以确保找到的结果是按字典序排列的。C++ 中的 sort() 函数是基于快排实现的,平均时间复杂度为 (O(N \log N)),可以有效地对产品进行排序。

sort(products.begin(), products.end());

2. 构建搜索前缀

在处理搜索词时,我们希望每次用户输入一个字母后更新当前前缀,并基于这个前缀寻找匹配的产品。例如,如果搜索词是 “mouse”,那么当用户输入第一个字母 “m” 时,前缀是 “m”;当输入第二个字母 “o” 时,前缀更新为 “mo”。

for (char c : searchWord) {
    prefix += c; // 每次添加一个字母到前缀中

每次循环中,我们根据新的 prefix 来进行产品查找。

3. 查找匹配产品

有了前缀后,我们接下来要做的是找出所有以该前缀开头的产品。由于之前已经排序过产品,所以在循环遍历产品时,一旦找到不匹配的产品,可以立即停止循环。我们使用 find(prefix) == 0 来判断一个产品是否以当前前缀开头。

代码解析
  • 判断前缀匹配product.find(prefix) == 0 表示当前产品 product 的开头是前缀 prefix
  • 存储前三个产品:在匹配产品的循环中,一旦找到的匹配产品达到 3 个,即 suggestions.size() == 3,就可以跳出循环,以避免不必要的计算。
for (const string& product : products) {
    if (product.find(prefix) == 0) { // 找到前缀匹配的产品
        suggestions.push_back(product); // 加入到推荐列表
        if (suggestions.size() == 3) // 只保留最多3个
            break;
    }
}

4. 存储并输出结果

每次找到符合条件的推荐产品后,我们将其添加到最终的结果列表 result 中:

result.push_back(suggestions);

完整代码实现

下面是完整的 C++ 实现,包括了以上所有步骤:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

vector<vector<string>> suggestedProducts(vector<string>& products, string searchWord) {
    // 对产品列表按字典序排序
    sort(products.begin(), products.end());
    vector<vector<string>> result; // 最终结果存储
    string prefix; // 当前前缀

    // 遍历每个字符,构建前缀并查找匹配的产品
    for (char c : searchWord) {
        prefix += c; // 构建当前前缀
        vector<string> suggestions; // 当前前缀的推荐产品列表

        // 遍历所有产品,找出匹配前缀的产品
        for (const string& product : products) {
            if (product.find(prefix) == 0) { // 如果产品以前缀开头
                suggestions.push_back(product);
                if (suggestions.size() == 3) // 只保留最多三个推荐
                    break;
            }
        }

        // 将当前前缀的推荐列表加入到结果中
        result.push_back(suggestions);
    }

    return result;
}

// 测试示例
int main() {
    vector<string> products = {"mobile", "mouse", "moneypot", "monitor", "mousepad"};
    string searchWord = "mouse";
    vector<vector<string>> results = suggestedProducts(products, searchWord);

    // 输出结果
    for (const auto& res : results) {
        cout << "[ ";
        for (const auto& str : res) {
            cout << str << " ";
        }
        cout << "]" << endl;
    }

    return 0;
}

运行结果示例

假设输入的 products{"mobile", "mouse", "moneypot", "monitor", "mousepad"}searchWord"mouse"。代码输出如下:

[ mobile moneypot monitor ]
[ mobile moneypot monitor ]
[ mouse mousepad ]
[ mouse mousepad ]
[ mouse mousepad ]

复杂度分析

  • 时间复杂度$O(N \log N + M \cdot N)$,其中 N N N 是产品的数量, M M M 是搜索词的长度。

    • 排序复杂度为 O ( N log ⁡ N ) O(N \log N) O(NlogN)
    • 查找前缀的复杂度为 O ( M ⋅ N ) O(M \cdot N) O(MN)
  • 空间复杂度O(M * 3),其中 (M) 是搜索词的长度,最大推荐产品数为 3。

总结

通过以上步骤,我们实现了一个动态推荐系统,它能在用户逐字输入时提供实时的产品推荐。我们利用字符串的 find() 方法有效地检查前缀匹配,同时通过逐步构建前缀确保推荐的准确性。这种算法设计思路不仅清晰而且高效,适合处理实际应用中的类似问题。希望本博客能帮助读者更好地理解此算法的实现过程和细节。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

day14:RSYNC同步

一&#xff0c;概述 概述 rsync &#xff08;开源&#xff09;是一个高效的文件同步和传输工具&#xff0c;广泛用于 Linux 和 Unix 系统中。它可以在本地和远程系统之间同步文件和目录&#xff0c;同时支持增量备份&#xff0c;能够只传输更改过的文件部分&#xff0c;以减少…

Matlab实现白鲸优化算法(BWO)求解路径规划问题

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 白鲸优化算法&#xff08;BWO&#xff09;是一种受自然界白鲸捕食行为启发的新型优化算法&#xff0c;它通过模拟白鲸的群体捕猎策略和社会互动来探索问题的最优解。BWO因其强大的全局搜索能力和高效的局部搜索能…

python 模块和包、类和对象

模块 模块是包含 Python 代码的文件&#xff0c;通常用于组织相关的函数、类和其他语句。模块可以被导入并在其他 Python 文件中使用。 创建模块 假设你创建了一个名为 mymodule.py 的文件&#xff0c;内容如下&#xff1a; # mymodule.pydef greet(name): return f"…

SpringBoot节奏:Web音乐网站构建手册

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

使用Django REST framework构建RESTful API

使用Django REST framework构建RESTful API Django REST framework简介 安装Django REST framework 创建Django项目 创建Django应用 配置Django项目 创建模型 迁移数据库 创建序列化器 创建视图 配置URL 配置全局URL 配置认证和权限 测试API 使用Postman测试API 分页 过滤和排序…

MySQL 9从入门到性能优化-系统信息函数

【图书推荐】《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》-CSDN博客 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…

芯片上音频相关的验证

通常芯片设计公司&#xff08;比如QUALCOMM&#xff09;把芯片设计好后交由芯片制造商&#xff08;比如台积电&#xff09;去生产&#xff0c;俗称流片。芯片设计公司由ASIC部门负责设计芯片。ASIC设计的芯片只有经过充分的验证&#xff08;这里说的验证是FPGA&#xff08;现场…

$tab的所有用法以及vue关闭页面的方法汇总

1、最简单粗暴的就是直接window.close(); 2.可以设置一个窗口的显示隐藏变量&#xff0c;比如点击新增按钮时&#xff0c;新增页面窗口就进行显示&#xff0c;点击关闭就把这个值置为flase 在最外层绑定open 初始值设为false 点击新增和修改按钮时&#xff0c;把状态置为true即…

深度学习(八) TensorFlow、PyTorch、Keras框架大比拼(8/10)

一、深度学习框架概述 深度学习框架在当今人工智能和机器学习领域中占据着至关重要的地位。其中&#xff0c;TensorFlow 由 Google 开发&#xff0c;自 2015 年发布以来&#xff0c;凭借其灵活的计算图、自动微分功能以及跨平台支持等特点&#xff0c;迅速成为主流深度学习框架…

<HarmonyOS第一课>HarmonyOS SDK开放能力简介的课后习题

不出户&#xff0c;知天下&#xff1b; 不窥牖&#xff0c;见天道。 其出弥远&#xff0c;其知弥少。 是以圣人不行而知&#xff0c;不见而明&#xff0c;不为而成。 本篇<HarmonyOS第一课>HarmonyOS SDK开放能力简介是简单介绍了HarmonyOS SDK&#xff0c;不需要大家过多…

WPF自定义日历控件Calendar 的方法

推荐下载地址 https://www.haolizi.net/example/view_2107.html <UserControl.Resources><local1:DayConverter x:Key"DayConverter"/><!--导入转换器--><Style x:Key"CalendarStyle1"TargetType"{x:Type Calendar}">&…

园区网典型技术应用

工厂、政府机关、商场、写字楼、校园、公园等&#xff0c;这些场所内为了实现数据互通而搭建的网络都可以称之为园区网 1. 园区网络架构与常见技术概述 某高校校园网络采用三层架构&#xff0c;核心层和汇聚层各有其明确的职责&#xff1a; 核心层&#xff1a;部署两台核心交…

计算机考研,选择西安交通大学还是哈工大?

C哥专业提供——计软考研院校选择分析专业课备考指南规划 经过全面分析&#xff0c;2025年考研西安交通大学和哈尔滨工业大学计算机专业的报考难度对比如下&#xff1a; 西安交通大学计算机专业 > 哈尔滨工业大学计算机专业 对于想要报考985高校计算机专业但核心目标是优…

3D游戏阴影技术综合指南

在维姆文德斯 (Wim Wenders) 的优秀作品《完美的日子》 (Perfect Days) 的结尾&#xff0c;男主角平山 (Hirayama) 在桥下喝啤酒&#xff0c;因为他看到一个商人在追求他的暗恋对象。突然&#xff0c;商人在桥下加入了他。事实证明&#xff0c;事情并没有那么简单&#xff0c;但…

Unity 2D寻路导航 NavMeshPlus解决方案

插件的github主页 h8man/NavMeshPlus: Unity NavMesh 2D Pathfinding 这个插件是基于新版3D寻路导航制作的&#xff0c;所以你可能需要看一下这篇文章 新旧Navmash 寻路导航组件对比 附使用案例与实用教程链接-CSDN博客 这行代码agent.updateUpAxis false 一定要为代理单位…

K8s企业应用之容器化迁移

#作者&#xff1a;曹付江 K8s企业应用之容器化迁移 Kubernetes&#xff08;K8s&#xff09;中的企业应用容器化迁移是一个复杂但重要的过程&#xff0c;平滑的迁移应用&#xff0c;可以让开发、运维、测试人员循序渐进的学习和掌握Kubernetes&#xff0c;通常包括以下步骤&am…

Flash的语音ic型号有哪些?

深圳唯创知音电子有限公司在语音技术领域具有深厚的积累&#xff0c;其Flash语音IC产品凭借高性能和广泛的应用领域&#xff0c;在市场上占据了一席之地。以下是对该公司Flash语音IC产品的详细介绍&#xff1a; 一、产品概述 Flash语音IC是一种采用Flash存储技术的语音芯片&…

vscode摸鱼学习插件开发

不知道大家在摸鱼的时候&#xff0c;会不会想要学习&#xff1f; 或者有没有考公人&#xff0c;下班要学习的&#xff1f; 上班时间摸鱼&#xff0c;下班时间不够学习&#xff1f; 为此&#xff0c;我决定开发一个vscode插件&#xff0c;来刷粉笔题 粉笔插件名称&#xff1a;…

PPT制作新选择:本地部署PPTist结合内网穿透实现实时协作和远程使用

文章目录 前言1. 本地安装PPTist2. PPTist 使用介绍3. 安装Cpolar内网穿透4. 配置公网地址5. 配置固定公网地址 &#x1f4a1; 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击跳转到网站】 前…

文件上传知识梳理:原理、工具、绕过、利用与防御

文章简介&#xff1a; 本文全面梳理了文件上传相关知识&#xff0c;包括文件上传漏洞的原理及危害&#xff0c;介绍了 Webshell 相关工具&#xff08;如冰蝎、哥斯拉、蚁剑&#xff09;&#xff0c;详细阐述了文件上传绕过检测的多种方法&#xff08;前端检测、服务端检测的各…