ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1268. 搜索推荐系统

2021-10-04 14:02:17  阅读:155  来源: 互联网

标签:node 1268 String TrieNode 推荐 搜索 result searchWord products


1268. 搜索推荐系统

给你一个产品数组 products 和一个字符串 searchWord ,products 数组中每个产品都是一个字符串。

请你设计一个推荐系统,在依次输入单词 searchWord 的每一个字母后,推荐 products 数组中前缀与 searchWord 相同的最多三个产品。如果前缀相同的可推荐产品超过三个,请按字典序返回最小的三个。

请你以二维列表的形式,返回在输入 searchWord 每个字母后相应的推荐产品的列表。

链接:https://leetcode-cn.com/problems/search-suggestions-system

import org.junit.Test;

import java.util.ArrayList;

import java.util.List;

public class Solution {
    private  class  TrieNode{
        boolean end = false;
        String str = null;
        int count = 0;
        TrieNode[] children = new TrieNode[26];
    }
    private class Trie{
        TrieNode root = new TrieNode();
        public void insert(String[] products){
            for (String str:
                    products) {
                insertWord(str);
            }
        }

        private void insertWord(String products) {
            TrieNode node = root;
            for(char c : products.toCharArray()){
                if(node.children[c - 'a'] == null){
                    node.children[c - 'a'] = new TrieNode();
                }
                node = node.children[c - 'a'];
            }
            if(node.end != true){
                node.end = true;
                node.str = products;
            }
            node.count++;
            System.out.println(node.count);
            System.out.println(node.str);
        }

        public List<List<String>> searchWord(String word){
            List<List<String>>  result = new ArrayList<>();
            for(int i = 1; i < word.length(); i++){
                result.add(search(word.substring(0, i)));
            }
            return result;
        }

        private List<String> search(String pattern) {
            List<String> result = new ArrayList<>();
            TrieNode node = root;
            for(char c : pattern.toCharArray()){
                if(node.children[c - 'a'] == null){
                    return result;
                }
                node = node.children[c - 'a'];
            }
            Solution(node,result);
            return  result;
        }

        private  void Solution(TrieNode root, List<String> result){
            if(root.end){
                for (int i = 0; i < root.count; i++) {
                    result.add(root.str);
                    if(result.size() == 3){
                        return;
                    }
                }
            }
            for (TrieNode node:
                    root.children) {
                if(node != null){ 
                    //System.out.println(node.str + "    " +node.end);
                    Solution(node, result);

                }
            }
            if(result.size() == 3){
                return;
            }
        }

    }

    public List<List<String>> suggestedProducts(String[] products, String searchWord) {
        Trie trie = new Trie();
        trie.insert(products);
        return trie.searchWord(searchWord);
    }

    @Test
    public  void  print(){
        String[] pro = {"mobile","mouse","mouse","moneypot","monitor","mousepad"};
        String searchWord = "mouse";
        List<List<String>> lists = new Solution().suggestedProducts(pro, searchWord);
        for(List list : lists){
            System.out.println(list.toString());
        }
    }
}


















标签:node,1268,String,TrieNode,推荐,搜索,result,searchWord,products
来源: https://blog.csdn.net/weixin_38623113/article/details/120603474

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有