【笔记】JavaScript版数据结构与算法——基础算法之“正则类”(10. 正则表达式匹配)


正则表达式匹配

1.题目

10. 正则表达式匹配 - 力扣(LeetCode)

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。

‘.’ 匹配任意单个字符
‘*’ 匹配零个或多个前面的那一个元素

所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。

说明:

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

示例 1:

输入:
s = “aa”
p = “a”
输出: false
解释: “a” 无法匹配 “aa” 整个字符串。

示例 2:

输入:
s = “aa”
p = “a*”
输出: true
解释: 因为 ‘*’ 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 ‘a’。因此,字符串 “aa” 可被视为 ‘a’ 重复了一次。

示例 3:

输入:

s = “ab”
p = “."
输出: true
解释: ".
” 表示可匹配零个或多个(’*’)任意字符(’.’)。

示例 4:

输入:
s = “aab”
p = “cab”
输出: true
解释: 因为 ‘*’ 表示零个或多个,这里 ‘c’ 为 0 个, ‘a’ 被重复一次。因此可以匹配字符串 “aab”。

示例 5:

输入:
s = “mississippi”
p = “misisp*.”
输出: false

题目模板

/**
 * @param {string} s
 * @param {string} p
 * @return {boolean}
 */
var isMatch = function(s, p) {

};

2.思路分析

在这里插入图片描述
这里的有无模式指的是是否有匹配符”*“或“.”
在这里插入图片描述
在这里插入图片描述

3.所用到的方法

主要是正则,看其他小伙伴还用到了动态规划、有向图、图的深度遍历、自动机,6p

4.题解及优化

课程解法

课程视频源码通不过。。。

var isMatch = function(s, p) {
  // 对模式变量进行正则筛选
  let modeArr = p.match(/([a-z.]\*)|([a-z]+(?=([a-z.]\*)|$))/g)
  let cur = 0
  let strLen = s.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 (s[cur] === m[0]) {
          cur++
        }
      }
    } else {
      for (let j = 0, jl = m.length; j < jl; j++) {
        if (m[j] !== s[cur]) {
          return false
        } else {
          cur++
        }
      }
    }
  }
  return cur === strLen
}

调试后:

var isMatch = function (s, p) {
  p = p.split('')
  p.push('a*')
  p = p.join('')
  console.log(p)
  s = s.split('')
  s.push('aa')
  s = s.join('')
  console.log(s)
  // 对模式变量进行正则筛选
  let modeArr = p.match(/([a-z.]\*)|([a-z]+(?=([a-z.]\*)|$))/g)
  let cur = 0
  let strLen = s.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 (s[cur] === m[0]) {
          cur++
        }
      }
    } else {
      for (let j = 0, jl = m.length; j < jl; j++) {
        if (m[j] !== s[cur]) {
          return false
        } else {
          cur++
        }
      }
    }
  }
  return cur === strLen
}

通过在s和p后添加*或其他字母都没有效果,应该是“.”的问题,代码进不去m[0] === '.'


课程后面提供的源码能够通过

var isMatch = function (s, p) {
  // 边界情况,如果s和p都为空,说明处理结束了,返回true,否则返回false
  if (p.length <= 0) {
    return !s.length
  }
  // 判断p模式字符串的第一个字符和s字符串的第一个字符是不是匹配
  let match = false
  if (s.length > 0 && (p[0] === s[0] || p[0] === '.')) {
    match = true
  }
  // p有模式的
  if (p.length > 1 && p[1] === '*') {
    // 第一种情况:s*匹配0个字符
    // 第二种情况:s*匹配1个字符,递归下去,用来表示s*匹配多个s
    return isMatch(s, p.slice(2)) || (match && isMatch(s.slice(1), p))
  } else {
    return match && isMatch(s.slice(1), p.slice(1))
  }
}

在这里插入图片描述

其他小伙伴的解法

var isMatch = function (s, p) {
  return new RegExp('^' + p + '$').test(s)
}

在这里插入图片描述

动态规划:状态转移方程分析

10、正则表达式匹配

【JavaScript 解法,非正则 】超越 99% 的提交

js动态规划图解 - 用图讲述更易懂

不确定的有限自动机,NFA实现正则匹配

不同答案,涉及较广,值得深入探索,待续。。。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
数据结构与算法是计算机科学中非常重要的概念。在Java中,有许多常见的数据结构和算法的实。其中,数据结构包括数组、链表、栈、队列、跳表、散列表、二叉树、堆、图和Trie树。而算法包括递归、排序、二分查找、哈希算法和字符串匹配算法。\[1\] 在Java中,我们可以使用散列表(哈希表)来实数据结构。而在字符串匹配算法中,有四种常见的算法:暴力匹配算法(BF算法)、RK算法、BM算法和KMP算法。这些算法都有各自的特点和适用场景。\[2\] 另外,在Java开发中,排序是一种常见的需求。我们可以使用一些常见的排序算法来对数据元素进行排序,比如按照日期对订单进行排序,按照价格对商品进行排序等等。在Java的开发工具包(JDK)中,已经提供了许多数据结构和算法的实,比如List、Set、Map和Math等。我们可以借鉴JDK的方式,将算法封装到某个中,并进行API的设计和实。\[3\] 综上所述,数据结构与算法在Java中有着广泛的应用,通过学习和使用这些概念和实,我们可以更好地解决问题和优化程序。 #### 引用[.reference_title] - *1* *2* [Java数据结构和算法学习笔记](https://blog.csdn.net/zth13015409853/article/details/121946203)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [数据结构与算法(Java篇)笔记--Comparable接口](https://blog.csdn.net/csh1807266489/article/details/126782378)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序边界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值