专注最新leetcode刷题,用自己的努力提升自己;用自己的分享,让更多人对算法更加得心应手
![92e4b5a8874b104e6841ac558bd47052.png](https://img-blog.csdnimg.cn/img_convert/92e4b5a8874b104e6841ac558bd47052.png)
![4c060a2fcbc6d19fc138052e5573503a.png](https://img-blog.csdnimg.cn/img_convert/4c060a2fcbc6d19fc138052e5573503a.png)
![67af9f3ec2f70c40795ead8280b9f90d.png](https://img-blog.csdnimg.cn/img_convert/67af9f3ec2f70c40795ead8280b9f90d.png)
题目描述
给你一个字符串数组products和一个字符串searchWord。我们设计一个系统,这个会随着searchWord的输入从products中推荐三个product的名字。推荐的products应该和输入的searchWord保持相同的前缀。如果此时有多于三个与输入searchWord相同的前缀,此时返回字典顺序最小的三个products的名字
返回:当输入每个searchWord的字母时返回对应的推荐products的列表
问题分析
- 返回的是按照字典顺序最小的三个products,所以第一反应有可能需要对输入的products进行排序
- 返回的是与输入searchWord具有相同前缀的products,也就是在排序后,在products中找到第一个与输入searchWord相同前缀(如果有),然后同时返回其后面与输入searchWord具有相同前缀的另外两个products
- 由于searchWord在输入过程中,会有不同的返回结果,所以第二个字母的键入时的结果肯定是在第一个键入的基础进行搜索的结果。
- 当没有匹配时,返回为[]
代码实现
vector> suggestedProducts(vector& ps, stringword) { sort(begin(ps), end(ps));//利用sort函数对原字符串进行升序排序 vector> res(word.size()); for (auto l = 1; l <= word.size(); ++l) { auto w = word.substr(0, l); auto it = lower_bound(begin(ps), end(ps), w);//lower_bound()来二分查找开始位置 for (; it != end(ps) && it->substr(0, l) == w && res[l - 1].size() < 3; ++it) res[l - 1].push_back(*it); } return res;}
复杂度分析
时间复杂度:由于采用了二叉树寻找,所以为O(nlogn)
空间复杂度:O(1)
总结
- 熟悉排序的相关方法,并会用sort函数Sort(start,end,cmp)(1)start表示要排序数组的起始地址; (2)end表示数组结束地址的下一位; (3)cmp用于规定排序的方法,可不填,默认升序 sort()函数是c++一种排序方法之一,相较冒泡排序和选择排序所带来的执行效率不高的问题,sort()函数使用的排序方法是类似于快速排序的方法,时间复杂度为n*log2(n),执行效率较高。
- 熟悉排序的二分查询方法,熟悉lower_bound或者upper_bound
![dd305146c8a36d487a5563e83a765d25.png](https://img-blog.csdnimg.cn/img_convert/dd305146c8a36d487a5563e83a765d25.png)