zoukankan      html  css  js  c++  java
  • 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);
     */
    
  • 相关阅读:
    FragmentTabHost实现标签卡效果
    TabLayout+ViewPager实现标签卡效果
    NavigationView的使用
    大数据怎么学习,在学习大数据之前,需要具备什么基础?
    为什么学习大数据,大数据科学家写给大数据学习者的坚定理由
    一步一步学习大数据:Hadoop 生态系统与场景
    0基础学习大数据你需要了解的学习路线和方向
    大数据的入门级学习(全套)
    大数据学习系列之—HBASE
    为什么这么多人学习大数据?新手该如何上手大数据?
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12946196.html
Copyright © 2011-2022 走看看