LeetCode探索(115):745-前缀和后缀搜索

107 阅读1分钟

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

题目

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

实现 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"

提示:

  • 1 <= words.length <= 10^4
  • 1 <= words[i].length <= 7
  • 1 <= pref.length, suff.length <= 7
  • words[i]prefsuff 仅由小写英文字母组成
  • 最多对函数 f 执行 10^4 次调用

思考

本题难度困难。

首先是读懂题意。我们需要实现 WordFilter 类,f(pref, suff)返回词典中具有前缀 prefix 和后缀 suff 的单词的下标。如果存在不止一个满足要求的下标,返回其中最大的下标。如果不存在这样的单词,返回 -1 。

这里我们遍历数组words,对于每个数组元素cur,如果前缀或后缀的长度大于cur的长度,则不满足条件。否则,从cur中按照前缀和后缀的长度,截取对应长度的字符串,再分别与前缀和后缀字符串进行比较,如果相等,则返回数组索引即可;否则,返回-1。

解答

方法一:遍历

class WordFilter {
  ss
  constructor(words) {
    this.ss = words
  }
  f(a, b) {
    const n = a.length, m = b.length
    // 题目是返回数组 this.ss 最大的索引
    for(let k = this.ss.length - 1; k >= 0; k--) {
      const cur = this.ss[k]
      const len = cur.length
      if (len < n || len < m) continue // 跳过当前单词
      if (cur.slice(0, n) === a && cur.slice(len - m) === b) {
        return k
      }
    }
    return -1
  }
}
// let wordFilter = new WordFilter(["apple"])
// let a = wordFilter.f("a", "e");
// console.log(a) // 0

参考