【LeetCode】前缀和后缀搜索Java题解

143 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情

题目描述

设计一个包含一些单词的特殊词典,并能够通过前缀和后缀来检索单词。

实现 WordFilter 类:

WordFilter(string[] words) 使用词典中的单词 words 初始化对象。 f(string pref, string suff) 返回词典中具有前缀 prefix 和后缀 suff 的单词的下标。如果存在不止一个满足要求的下标,返回其中 最大的下标 。如果不存在这样的单词,返回 -1 。  

示例:

输入
["WordFilter", "f"]
[[["apple"]], ["a", "e"]]
输出
[null, 0]
解释
WordFilter wordFilter = new WordFilter(["apple"]);
wordFilter.f("a", "e"); // 返回 0 ,因为下标为 0 的单词:前缀 prefix = "a" 且 后缀 suff = "e" 。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/prefix-and-suffix-search
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

  • 今天的算法题目是设计类题目,题目要求实现通过前缀和后缀来检索单词。解决查询问题,我们一般采用 hashMap 这种数据结构。采用 hashMap 解决这个问题的时候,我们先预处理,使用朴素的思想,枚举出每一种前缀和后缀,然后对应出相应的下标。在代码实践中,枚举出每一种前缀和后缀,我们通常采用 StringBuilder 的方式实现,避免字符串频繁的创建和修改。提升执行效率。具体实现代码如下,供参考。

通过代码

class WordFilter {
    Map<String, Integer> map = new HashMap<>();
    public WordFilter(String[] words) { 
        int n = words.length;
        for (int i = 0; i < n; i++) {
            int wordLength = words[i].length();

            for (int prefixLength = 1; prefixLength <= wordLength; prefixLength++) {
                for (int suffixLength = 1; suffixLength <= wordLength; suffixLength++) {
                    StringBuilder temp = new StringBuilder();
                    temp.append(words[i].substring(0, prefixLength));
                    temp.append('#');
                    temp.append(words[i].substring(wordLength - suffixLength));
                    map.put(temp.toString(), i);
                }
            }
        }
    }
    
    public int f(String pref, String suff) {
        StringBuilder temp = new StringBuilder();
        temp.append(pref);
        temp.append('#');
        temp.append(suff);
        return map.getOrDefault(temp.toString(), -1);
    }
}

/**
 * Your WordFilter object will be instantiated and called as such:
 * WordFilter obj = new WordFilter(words);
 * int param_1 = obj.f(pref,suff);
 */

总结

  • 本题主要考察的数据结构的灵活应用,熟练使用 hashMap 等结构,可以提升算法的执行效率。
  • 坚持算法每日一题,加油!