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);
*/

最新文章

  1. 分享一个ruby网站 | 菜鸟教程
  2. VS2013不显示最近打开文件
  3. [转]史上最全的CSS hack方式一览
  4. Unity UGUI HUD 怪物血条实现
  5. 老外写的在桌面添加快捷方式(DELPHI XE5 ANDROID)
  6. open file 值修改
  7. 计算字符串的最长回文子串 :Manacher算法介绍
  8. LGDT/LIDT-加载全局/中断描述符表寄存器
  9. oracle数据库使用plsql(64位)时出现的问题
  10. Js闭包与循环
  11. redhat linux enterprise 5 输入ifconfig无效的解决方法
  12. SharePoint 调用WebService操作List小记
  13. var let const
  14. SET NOCOUNT { ON | OFF }
  15. Java知多少(38)抽象类的概念和使用
  16. Step7:SQL Server 多实例下的复制
  17. spring 通过@Value 获取properties文件中设置了属性 ,与@Value # 和$的区别
  18. MySQL主从同步的一个小问题解决
  19. 使用java配置来构建spring项目
  20. 【luogu2181】对角线

热门文章

  1. 一步步打造QQ群发消息群发器
  2. 【Hadoop离线基础总结】Hadoop的架构模型
  3. FAXCOM和FXSCOMEX 传真编程
  4. [hdu5247]rmq+预处理
  5. Gulp的代理转发插件
  6. android 防止多次点击,导致事件监听响应到其他界面
  7. 计算机组成及系统结构-第九章 输入输出(I/O)设备
  8. mybatis随记
  9. 【比较】粒子群算法PSO 和 遗传算法GA 的相同点和不同点
  10. 06.drf(django)的权限