Dado un conjunto de cadenas products
y una cadena searchWord
. Queremos diseñar un sistema que sugiera como máximo tres nombres de productos products
después de searchWord
escribir cada carácter de . Los productos sugeridos deben tener un prefijo común con searchWord. Si hay más de tres productos con un prefijo común, devuelva los tres productos mínimos de lexicografía.
Regrese la lista de listas de lo sugerido products
después de searchWord
escribir cada carácter de .
Ejemplo 1:
Input: products = ["mobile","mouse","moneypot","monitor","mousepad"], searchWord = "mouse"
Output: [
["mobile","moneypot","monitor"],
["mobile","moneypot","monitor"],
["mouse","mousepad"],
["mouse","mousepad"],
["mouse","mousepad"]
]
Explanation: products sorted lexicographically = ["mobile","moneypot","monitor","mouse","mousepad"]
After typing m and mo all products match and we show user ["mobile","moneypot","monitor"]
After typing mou, mous and mouse the system suggests ["mouse","mousepad"]
Idea: use trie, O (n * len (word)); Tenga en cuenta que si no hay coincidencia, todo lo siguiente se agrega vacío, por lo que cur == null;
class Solution {
private class TrieNode {
private TrieNode[] children;
private boolean isword;
private ArrayList<String> list;
public TrieNode () {
this.children = new TrieNode[26];
this.isword = false;
this.list = new ArrayList<String>();
}
}
private class Trie{
public TrieNode root;
public Trie() {
root = new TrieNode();
}
public void insert(String word) {
TrieNode cur = root;
for(int i = 0; i < word.length(); i++) {
char c = word.charAt(i);
if(cur.children[c - 'a'] == null) {
cur.children[c - 'a'] = new TrieNode();
}
cur = cur.children[c - 'a'];
cur.list.add(word);
}
cur.isword = true;
}
}
public List<List<String>> suggestedProducts(String[] products, String searchWord) {
List<List<String>> lists = new ArrayList<List<String>>();
if(products == null || products.length == 0) {
return lists;
}
Trie trie = new Trie();
for(String word: products) {
trie.insert(word);
}
TrieNode cur = trie.root;
for(int i = 0; i < searchWord.length(); i++) {
char c = searchWord.charAt(i);
List<String> list = new ArrayList<String>();
if( cur != null && cur.children[c - 'a'] != null) {
cur = cur.children[c - 'a'];
Collections.sort(cur.list);
for(String str: cur.list) {
list.add(str);
if(list.size() == 3) {
break;
}
}
} else {
// 代表以后的char没有match了;
cur = null;
}
lists.add(list);
}
return lists;
}
}