题目描述
给你一个产品数组products
和一个字符串searchWord
,products
数组中每个产品都是一个字符串。
请你设计一个推荐系统,在依次输入单词searchWord
的每一个字母后,推荐products
数组中前缀与searchWord
相同的最多三个产品。如果前缀相同的可推荐产品超过三个,请按字典序返回最小的三个。
请你以二维列表的形式,返回在输入searchWord
每个字母后相应的推荐产品的列表。
思路:
没有必要构建字典树,只需要先将字典单词排序
,每次遍历前缀符合的单词,保留集合以供下一轮遍历
。多次重复遍历即可得出结果。
代码:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
class Solution {
public List<List<String>> suggestedProducts(String[] products, String searchWord) {
List<List<String>> res = new ArrayList<>();
Arrays.sort(products);
List<String> row = new ArrayList<>();
row.addAll(Arrays.asList(products));
List<String> tmp = new ArrayList<>();
Iterator it = row.iterator();
for (int i = 0; i < searchWord.length(); i++) {
while(it.hasNext()){
String product = (String)it.next();
if(i<product.length() && product.charAt(i) == searchWord.charAt(i)){
if(tmp.size() < 3) {
tmp.add(product);
}
}else {
it.remove();
}
}
res.add(tmp);
it = row.iterator();
tmp = new ArrayList<>();
}
return res;
}
public static void main(String[] args) {
String[] strs = {"mobile","mouse","moneypot","monitor","mousepad"};
System.out.println(new Solution().suggestedProducts(strs, "mouse"));
}
}