All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g1201_1300.s1268_search_suggestions_system.Solution Maven / Gradle / Ivy

There is a newer version: 1.38
Show newest version
package g1201_1300.s1268_search_suggestions_system;

// #Medium #Array #String #2022_03_14_Time_28_ms_(78.06%)_Space_73.1_MB_(38.32%)

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 1268 - Search Suggestions System\.
 *
 * Medium
 *
 * You are given an array of strings `products` and a string `searchWord`.
 *
 * Design a system that suggests at most three product names from `products` after each character of `searchWord` is typed. Suggested products should have common prefix with `searchWord`. If there are more than three products with a common prefix return the three lexicographically minimums products.
 *
 * Return _a list of lists of the suggested products after each character of_ `searchWord` _is typed_.
 *
 * **Example 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"]
 *
 * **Example 2:**
 *
 * **Input:** products = ["havana"], searchWord = "havana"
 *
 * **Output:** [["havana"],["havana"],["havana"],["havana"],["havana"],["havana"]]
 *
 * **Example 3:**
 *
 * **Input:** products = ["bags","baggage","banner","box","cloths"], searchWord = "bags"
 *
 * **Output:** [["baggage","bags","banner"],["baggage","bags","banner"],["baggage","bags"],["bags"]]
 *
 * **Constraints:**
 *
 * *   `1 <= products.length <= 1000`
 * *   `1 <= products[i].length <= 3000`
 * *   1 <= sum(products[i].length) <= 2 * 104
 * *   All the strings of `products` are **unique**.
 * *   `products[i]` consists of lowercase English letters.
 * *   `1 <= searchWord.length <= 1000`
 * *   `searchWord` consists of lowercase English letters.
**/
public class Solution {
    public List> suggestedProducts(String[] products, String searchWord) {
        Trie trie = new Trie();
        Arrays.sort(products);
        for (String p : products) {
            trie.insert(p);
        }

        return trie.getResult(searchWord);
    }

    static class Trie {
        Node root;

        public Trie() {
            root = new Node();
        }

        void insert(String word) {
            Node curr = root;
            for (int i = 0; i < word.length(); i++) {
                char c = word.charAt(i);
                if (!curr.containsKey(c)) {
                    curr.put(c, new Node());
                }
                curr = curr.get(c);
                curr.addToList(word);
            }
        }

        List> getResult(String searchWord) {
            Node curr = root;
            List> res = new ArrayList<>();
            for (int i = 0; i < searchWord.length(); i++) {
                char c = searchWord.charAt(i);
                List temp = new ArrayList<>();
                if (curr != null) {
                    curr = curr.get(c);
                }

                for (int j = 0; j < 3 && curr != null && j < curr.getList().size(); j++) {
                    temp.add(curr.getList().get(j));
                }
                res.add(new ArrayList<>(temp));
            }
            return res;
        }
    }

    static class Node {
        Node[] links;
        List list;

        public Node() {
            links = new Node[26];
            list = new ArrayList<>();
        }

        boolean containsKey(char c) {
            return links[c - 'a'] != null;
        }

        Node get(char c) {
            return links[c - 'a'];
        }

        void put(char c, Node node) {
            links[c - 'a'] = node;
        }

        void addToList(String s) {
            list.add(s);
        }

        List getList() {
            return list;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy