前缀和后缀搜索

172 阅读1分钟

745. 前缀和后缀搜索 - 力扣(LeetCode)

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

实现 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 执行 104 次调用

解题一

/**
 * @param {string[]} words
 */
const a = "a".charCodeAt(0);
var WordFilter = function (words) {
  this.words = words;
  this.pref = new Array(26).fill(null).map(() => []);
  for (let i = words.length; i--; ) {
    const first = words[i].charCodeAt(0) - a;
    this.pref[first].push(i);
  }
};

/**
 * @param {string} pref
 * @param {string} suff
 * @return {number}
 */
WordFilter.prototype.f = function (pref, suff) {
  const first = pref.charCodeAt(0) - a;
  const idxs = this.pref[first];
  for (let i = 0; i < idxs.length; i++) {
    const idx = idxs[i];
    const word = this.words[idx];
    if (word.startsWith(pref) && word.endsWith(suff)) {
      return idx;
    }
  }
  return -1;
};
/**
 * Your WordFilter object will be instantiated and called as such:
 * var obj = new WordFilter(words)
 * var param_1 = obj.f(pref,suff)
 */

解题二

/**
 * @param {string[]} words
 */
var WordFilter = function (words) {
  this.map = new Map();
  for (let i = 0; i < words.length; i++) {
    const word = words[i];
    for (let j = 1; j <= word.length; j++) {
      let pref = word.slice(0, j);
      for (let k = word.length; k--; ) {
        let suff = word.slice(k);
        this.map.set(`${pref}_${suff}`, i);
      }
    }
  }
};

/**
 * @param {string} pref
 * @param {string} suff
 * @return {number}
 */
WordFilter.prototype.f = function (pref, suff) {
  let idx = this.map.get(`${pref}_${suff}`);
  return idx === undefined ? -1 : idx;
};

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