• Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)


    745. 前缀和后缀搜索

    给定多个 words,words[i] 的权重为 i 。

    设计一个类 WordFilter 实现函数WordFilter.f(String prefix, String suffix)。这个函数将返回具有前缀 prefix 和后缀suffix 的词的最大权重。如果没有这样的词,返回 -1。

    例子:

    输入:
    WordFilter([“apple”])
    WordFilter.f(“a”, “e”) // 返回 0
    WordFilter.f(“b”, “”) // 返回 -1
    注意:

    words的长度在[1, 15000]之间。
    对于每个测试用例,最多会有words.length次对WordFilter.f的调用。
    words[i]的长度在[1, 10]之间。
    prefix, suffix的长度在[0, 10]之前。
    words[i]和prefix, suffix只包含小写字母。

    class WordFilter {
    
         HashMap<String, List<Integer>> prefMap = new HashMap<>();
            HashMap<String, List<Integer>> suffMap = new HashMap<>();
            String[] words;
    
            void addToPref(String word, int idx) {
                int wlen = word.length();
                for (int i = 1; i <= wlen; i++) {
                    prefMap.computeIfAbsent(word.substring(0, i), k -> new ArrayList<>()).add(idx);
                }
            }
    
            void addToSuff(String word, int idx) {
                int wlen = word.length();
                for (int i = 0; i < wlen; i++) {
                    suffMap.computeIfAbsent(word.substring(i), k -> new ArrayList<>()).add(idx);
                }
            }
    
            public WordFilter(String[] words) {
                int size = words.length;
                this.words = words;
                for (int i = 0; i < size; i++) {
                    addToPref(words[i], i);
                    addToSuff(words[i], i);
                }
            }
    
            public int f(String prefix, String suffix) {
                List<Integer> l1 = prefMap.get(prefix);
                List<Integer> l2 = suffMap.get(suffix);
                if (prefix.length() == 0 || suffix.length() == 0) {
                    if (prefix.length() == 0 && suffix.length() == 0) {
                        return words.length-1;
                    }
                    if (prefix.length() == 0) {
                        return l2 == null ? -1 : l2.get(l2.size()-1);
                    }
                    return l1 == null ? -1 : l1.get(l1.size()-1);
                }
                if (l1 == null || l2 == null) return -1;
                int idx1 = l1.size()-1;
                int idx2 = l2.size()-1;
                while (idx1 >= 0 && idx2 >= 0) {
                    int i1 = l1.get(idx1);
                    int i2 = l2.get(idx2);
                    if (i1 == i2) return i1;
                    if (i1 < i2)
                        idx2--;
                    else idx1--;
                }
                return -1;
            }
    }
    
    /**
     * Your WordFilter object will be instantiated and called as such:
     * WordFilter obj = new WordFilter(words);
     * int param_1 = obj.f(prefix,suffix);
     */
    
  • 相关阅读:
    js将数字转为千分位/清除千分位
    mybatis中的$和#的区别
    js处理title超长问题
    mybatis错误 Mapped Statements collection does not contain value for
    bootstrap添加多个模态对话框支持
    java.util.Collections.copy()方法注意点
    list通过比较器进行排序
    jquery对radio和checkbox的操作
    c++类简介
    c++ 类
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13074851.html
Copyright © 2020-2023  润新知