美文网首页JavaScript
字符串正则匹配问题算法题

字符串正则匹配问题算法题

作者: Lia代码猪崽 | 来源:发表于2021-04-06 15:36 被阅读0次

    题目

    设计一个支持以下两种操作的数据结构:

    void addWord(word)
    bool search(word)
    

    search(word) 可以搜索文字或正则表达式字符串,字符串只包含字母 .a-z
    . 可以表示任何一个字母。

    示例:

    addWord("bad")
    addWord("dad")
    addWord("mad")
    search("pad") // false
    search("bad")  // true
    search(".ad")  // true
    search("b..")  // true
    

    思路分析

    • 这道题要求字符串既可以被添加、又可以被搜索,这就意味着字符串在添加时一定要被存在某处。键值对存储,我们用 Map(或对象字面量来模拟 Map)。
    • 这里为了降低查找时的复杂度,我们可以考虑以字符串的长度为 key,相同长度的字符串存在一个数组中,这样可以提高我们后续定位的效率。
    • 在搜索前需要额外判断一下,传入的到底是普通字符串,还是正则表达式。若是普通字符串,则直接去 Map 中查找是否有这个 key;若是正则表达式,则创建一个正则表达式对象,判断 Map 中相同长度的字符串里,是否存在一个能够与这个正则相匹配。

    代码

    class WordDictionary {
      constructor() {
        this.words = {}
      }
    
      addWord(word) {
        if (this.words[word.length]) {
          this.words[word.length].push(word)
        } else {
          this.words[word.length] = [word]
        }
      }
    
      search(word) {
        // 若该字符串长度在 Map 中对应的数组根本不存在,则可判断该字符串不存在
        if (!this.words[word.length]) {
          return false
        }
    
        // 缓存目标字符串的长度
        const len = word.length
        // 如果字符串中不包含‘.’,那么一定是普通字符串
        if (!word.includes('.')) {
          return this.words[len].includes(word)
        }
        // 否则是正则表达式,要先创建正则表达式对象
        const reg = new RegExp(word)
        return this.words[len].some((item) => {
          return reg.test(item)
        })
      }
    }
    
    const wordDictionary = new WordDictionary()
    wordDictionary.addWord("bad")
    wordDictionary.addWord("dad")
    wordDictionary.addWord("mad")
    wordDictionary.search("pad") // false
    wordDictionary.search("bad")  // true
    wordDictionary.search(".ad")  // true
    wordDictionary.search("b..")  // true
    

    相关文章

      网友评论

        本文标题:字符串正则匹配问题算法题

        本文链接:https://www.haomeiwen.com/subject/bwnskltx.html