携手创作,共同成长!这是我参与「掘金日新计划 · 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^41 <= words[i].length <= 71 <= pref.length, suff.length <= 7words[i]、pref和suff仅由小写英文字母组成- 最多对函数
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