Sistema de sugerencias de búsqueda

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; 
    }
}

 

710 artículos originales publicados · Me gusta 13 · Visitas 190,000+

Supongo que te gusta

Origin blog.csdn.net/u013325815/article/details/105463964
Recomendado
Clasificación