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);
 */
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章