【Leetcode】1268. Search Suggestions System
阿新 • • 發佈:2021-01-15
題目地址:
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]為字首的字串,則記錄空列表。程式碼如下:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Solution {
public List< List<String>> suggestedProducts(String[] products, String searchWord) {
List<List<String>> res = new ArrayList<>();
Arrays.sort(products);
int l = 0, r = products.length - 1;
for (int i = 0; i < searchWord.length(); i++) {
String sub = searchWord.substring(0, i + 1);
// 注意這裡l不用回退,因為一個字串後面新增字元只會使得字典序變大
r = products.length - 1;
// 二分查詢第一個字典序大於等於sub的字串位置
while (l < r) {
int m = l + (r - l >> 1);
if (products[m].compareTo(sub) >= 0) {
r = m;
} else {
l = m + 1;
}
}
// 如果不存在字典序大於等於sub的字串,則說明沒有字串以sub為字首,直接新增空列表
if (products[l].compareTo(sub) < 0) {
res.add(new ArrayList<>());
} else {
List<String> list = new ArrayList<>();
for (int j = l; j < l + 3 && j < products.length; j++) {
if (products[j].startsWith(sub)) {
list.add(products[j]);
} else {
break;
}
}
res.add(list);
}
}
return res;
}
}
時間複雜度 O ( n l log n + l s 2 log n ) O(nl\log n+l_s^2\log n) O(nllogn+ls2logn),空間 O ( 1 ) O(1) O(1)。