【LeetCode75】第七十一题 搜索推荐系统

文章讲述了如何通过构建前缀树并结合产品数组排序,实现当输入字符串时,找到与之具有相同前缀的前三名字典序最小的产品。作者提供了两种方法,包括使用前缀树和直接对产品数组排序后进行遍历比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

给我们一个产品数组,以及一个字符串,我们模拟依次输入字符串中的每一个字符,要求返回与对应的输入字符串拥有相同前缀的产品,每次只输出前三个字典序较小的产品。

那么跟前缀有关的题目我们都可以使用前缀树来完成,先用产品数组构建出前缀树,接着按照每次输入进去的字符串对前缀树进行搜索,把搜索到的有相同前缀的字符串中的前三个字典序较小的添加进答案中。

前缀树的具体做法可以参考上一题我写的题解。我这里就不多介绍了。

我个人不太喜欢在刷题的时候额外建一个新的类(因为我懒)。所以我再介绍一种其他做法。

首先对整个产品数组排序,这样后续就不必考虑字典序的问题了。

再我们对输入字符串遍历,来模拟输入的字符串。

接着再对产品进行遍历,如果产品和输入的字符串相同下标的字符不一致,那么表示他们没有相同的前缀,并且往后再怎么输入其他字符也不会用有同样的前缀了,所以可以把这个产品从数组里移除。

遍历结束再向答案数组里塞进前三个产品。

最后对输入遍历完毕我们就获取到了模拟输入产生的效果了。

代码:

class Solution {
public:
    vector<vector<string>> suggestedProducts(vector<string>& products, string searchWord) {
        vector<vector<string>>res;
        sort(products.begin(),products.end());  //提前排序保证字典序
        for(int i=0;i<searchWord.size();i++){   //逐字符输入
            vector<string>temp;
            int index=0;
            while(index<products.size()){   //比较每一个现存产品
                //如果发现同下标的字符不一致,那么后续输入其他字符就更不会有相同前缀了,所以从现存产品中移除
                if(i>=products[index].size() || products[index][i]!=searchWord[i]){ 
                    products.erase(products.begin()+index);
                }else{
                    index++;
                }
            }
            for(int j=0;j<products.size()&&j<3;j++){    //添加前三个现存产品
                temp.push_back(products[j]);
            }
            res.push_back(temp);
        }        
        return res;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值