• leetcode(js)算法10之正则表达式匹配


    mmp,对着答案看了三遍才看懂,真是菜的抠脚

    给定一个字符串 (s) 和一个字符模式 (p)。实现支持 '.' 和 '*' 的正则表达式匹配。

    '.' 匹配任意单个字符。
    '*' 匹配零个或多个前面的元素。
    匹配应该覆盖整个字符串 (s) ,而不是部分字符串。

    说明:

    s 可能为空,且只包含从 a-z 的小写字母。
    p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。

    示例 1:
    
    输入:
    s = "aa"
    p = "a"
    输出: false
    解释: "a" 无法匹配 "aa" 整个字符串。
    示例 2:
    
    输入:
    s = "aa"
    p = "a*"
    输出: true
    解释: '*' 代表可匹配零个或多个前面的元素, 即可以匹配 'a' 。因此, 重复 'a' 一次, 字符串可变为 "aa"。
    示例 3:
    
    输入:
    s = "ab"
    p = ".*"
    输出: true
    解释: ".*" 表示可匹配零个或多个('*')任意字符('.')。
    示例 4:
    
    输入:
    s = "aab"
    p = "c*a*b"
    输出: true
    解释: 'c' 可以不被重复, 'a' 可以被重复一次。因此可以匹配字符串 "aab"。
    示例 5:
    
    输入:
    s = "mississippi"
    p = "mis*is*p*."
    输出: false
    

    代码:

    export default (str, mode) => {
      // 对模式变量进行正则筛选
      let modeArr = mode.match(/([a-z.]*)|([a-z]+(?=([a-z.]*)|$))/g)
      let cur = 0
      let strLen = str.length
      for (let i = 0, len = modeArr.length, m; i < len; i++) {
        // 对于模式分为三类,.*|a*|cdef
        m = modeArr[i].split('')
        // 如果第二位是*表示是有模式的
        if (m[1] === '*') {
          if (m[0] === '.') {
            cur = strLen
            break
          } else {
            while (str[cur] === m[0]) {
              cur++
            }
          }
        } else {
          for (let j = 0, jl = m.length; j < jl; j++) {
            if (m[j] !== str[cur]) {
              return false
            } else {
              cur++
            }
          }
        }
      }
      return cur === strLen
    }
    
    
  • 相关阅读:
    课后作业-阅读任务-阅读笔记-4
    《团队--学生成绩管理-阶段互评》
    《团队-学生成绩管理-阶段互评》
    团队编程项目作业4-开发文档
    阅读任务--阅读提问-3
    课后作业-阅读任务-阅读笔记3
    课后作业-阅读任务-阅读提问-3
    课后作业-阅读任务-阅读笔记-3
    结对编程项目作业5
    结对编程项目作业4
  • 原文地址:https://www.cnblogs.com/raind/p/10555412.html
Copyright © 2020-2023  润新知