Open Genzhen opened 3 years ago
搜索单词时间复杂度: O(N^2)
class Word {
constructor() {
this.words = new Set()
}
addWord(word) {
this.words.add(word)
}
search(word1) {
function compareWord(word1, word2) {
const wLen1 = word1.length, wLen2 = word2.length
if (wLen1 !== wLen2) return false
let i = 0
while(i < wLen1) {
if (word1[i] === '.') {
i++
continue
}
if (word1[i] !== word2[i]) {
return false
}
i++
}
return true
}
for (const word2 of this.words) {
if (compareWord(word1, word2)) {
return
}
}
return false
}
}
function Word() {
this.word = new Set()
}
Word.prototype.addWord = function (string) {
this.word.add(string)
}
Word.prototype.search = function (string) {
if (this.word.has(string)) return true
let reg = new RegExp(string)
let words = [...this.word].join()
return reg.test(words)
}
搜索单词时间复杂度: O(N^2)
class Word { constructor() { this.words = new Set() } addWord(word) { this.words.add(word) } search(word1) { function compareWord(word1, word2) { const wLen1 = word1.length, wLen2 = word2.length if (wLen1 !== wLen2) return false let i = 0 while(i < wLen1) { if (word1[i] === '.') { i++ continue } if (word1[i] !== word2[i]) { return false } i++ } return true } for (const word2 of this.words) { if (compareWord(word1, word2)) { return } } return false } }
思路借鉴:对单词按单词长度分组
class Word {
constructor() {
this.words = new Map()
}
addWord(word) {
const wLen = word.length
const words = this.words.get(wLen)
const added = words && words.add(word)
if (!added) {
this.words.set(wLen, new Set([word]))
}
}
search(word) {
const wLen = word.length
const words = this.words
if (!words.has(wLen)) return false
if (!word.includes('.')) {
return words.get(wLen).has(word)
}
const reg = new RegExp(word)
return [...words.get(wLen)].some(word => reg.test(word))
}
}
扫描下方二维码,收藏关注,及时获取答案以及详细解析,同时可解锁800+道前端面试题。
思路分析
这道题要求字符串既可以被添加、又可以被搜索,这就意味着字符串在添加时一定要被存在某处。键值对存储,可以用 Map(或对象字面量来模拟 Map)。
难点在于 search 这个 API,它既可以搜索文字,又可以搜索正则表达式。所以在搜索前需要额外判断一下,传入的到底是普通字符串,还是正则表达式。如果是普通字符串,则直接去 Map 中查找是否有这个 key;如果是正则表达式,则创建一个正则表达式对象,判断 Map 中相同长度的字符串里,是否存在一个能够与这个正则相匹配。
参考实现