题目地址:
https://leetcode.com/problems/search-suggestions-system/
给定一个长 n n n的字符串数组 A A A,再给定一个字符串 s s s,要求返回一个以字符串列表为元素的列表 W W W,使得 W [ i ] W[i] W[i]是 A A A中以 s [ 0 : i ] s[0:i] s[0:i]为前缀的所有字符串中字典序最小的三个字符串(不够的话就找最小的两个、一个或以空列表作结果)。
可以先将 A A A按字典序排序,对于每个 s s s的前缀 s [ 0 : i ] s[0:i] s[0:i],我们找到 A A A中第一个字典序大于等于 s [ 0 : i ] s[0:i] s[0:i]的字符串,如果该字符串以 s [ 0 : i ] s[0:i] s[0:i]为前缀,那么就将该字符串向后找凑够 3 3 3个以 s [ 0 : i ] s[0:i] s[0:i]前缀的字符串即可,否则说明不存在以 s [ 0 : i ] s[0:i] s[0:i]为前缀的字符串,则记录空列表。代码如下:
class Solution {
public:
vector<vector<string>> suggestedProducts(vector<string>& ps, string w) {
vector<vector<string>> res;
sort(ps.begin(), ps.end());
string sub;
for (int i = 0, k = 0; i < w.size(); i++) {
sub += w[i];
// 找第一个字典序大于等于sub的字符串
while (k < ps.size() && ps[k] < sub) k++;
if (k == ps.size())
res.push_back({});
else {
vector<string> v;
for (int j = k; j < k + 3 && j < ps.size(); j++)
if (ps[j].substr(0, sub.size()) == sub) v.push_back(ps[j]);
res.push_back(v);
}
}
return res;
}
};
时间复杂度 O ( n max l A i log n + l s 2 ) O(n\max l_{A_i}\log n+l_s^2) O(nmaxlAilogn+ls2),空间 O ( 1 ) O(1) O(1)。