給定多個 words,words[i] 的權重爲 i 。java
設計一個類 WordFilter 實現函數WordFilter.f(String prefix, String suffix)。這個函數將返回具備前綴 prefix 和後綴suffix 的詞的最大權重。若是沒有這樣的詞,返回 -1。app
例子:ide
輸入:
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); */