1. 程式人生 > 其它 >【Leetcode】1268. Search Suggestions System

【Leetcode】1268. Search Suggestions System

技術標籤:# 二分、位運算與數學字串列表leetcode

題目地址:

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)