• 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);
     */
    
  • 相关阅读:
    free online Twitter video downloader All In One
    Game Development Essential Terms All In One
    Offscreen Canvas All In One
    前端性能优化系列之 Service Workers 实战教程 All In One
    前端性能优化系列之 Web Workers 实战教程 All In One
    河南美食阿利茄汁面 All In One
    free online Youtube video downloader All In One
    Leetcode 2264. 字符串中最大的 3 位相同数字(可以,已解决)
    多分类任务中不同隐藏层层数对实验结果的影响(使用GPU)
    Pytorch 损失函数总结
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13074851.html
Copyright © 2020-2023  润新知