首页 > 其他分享 >[10] 正则表达式匹配

[10] 正则表达式匹配

时间:2023-11-22 17:00:32浏览次数:96  
标签:10 匹配 正则表达式 sLen 位置 pLen XXXa dp

/**
 * @param {string} s
 * @param {string} p
 * @return {boolean}
 */
var isMatch = function (s, p) {
  if (s == null || p == null) return false;//极端情况 s和p都是空 返回false

  const sLen = s.length, pLen = p.length;

  const dp = new Array(sLen + 1);//因为位置是从0开始的,第0个位置是空字符串 所以初始化长度是sLen + 1
  for (let i = 0; i < dp.length; i++) {//初始化dp数组
    dp[i] = new Array(pLen + 1).fill(false); // 将项默认为false
  }
  // base case s和p第0个位置是匹配的
  dp[0][0] = true;
  for (let j = 1; j < pLen + 1; j++) {//初始化dp的第一列,此时s的位置是0
    //情况1:如果p的第j-1个位置是*,则j的状态等于j-2的状态
    //例如:s='' p='a*' 相当于p向前看2个位置如果匹配,则*相当于重复0个字符
    if (p[j - 1] == "*") dp[0][j] = dp[0][j - 2];
  }
  // 迭代
  for (let i = 1; i < sLen + 1; i++) {
    for (let j = 1; j < pLen + 1; j++) {

      //情况2:如果s和p当前字符是相等的 或者p当前位置是. 则当前的dp[i][j] 可由dp[i - 1][j - 1]转移过来
      //当前位置相匹配,则s和p都向前看一位 如果前面所有字符相匹配 则当前位置前面的所有字符也匹配
      //例如:s='XXXa' p='XXX.' 或者 s='XXXa' p='XXXa'
      if (s[i - 1] == p[j - 1] || p[j - 1] == ".") {
        dp[i][j] = dp[i - 1][j - 1];
      } else if (p[j - 1] == "*") {//情况3:进入当前字符不匹配的分支 如果当前p是* 则有可能会匹配
        //s当前位置和p前一个位置相同 或者p前一个位置等于. 则有三种可能
        //其中一种情况能匹配 则当前位置的状态也能匹配
        //dp[i][j - 2]:p向前看2个位置,相当于*重复了0次,
        //dp[i][j - 1]:p向前看1个位置,相当于*重复了1次
        //dp[i - 1][j]:s向前看一个位置,相当于*重复了n次
        //例如 s='XXXa' p='XXXa*'
        if (s[i - 1] == p[j - 2] || p[j - 2] == ".") {
          dp[i][j] = dp[i][j - 2] || dp[i][j - 1] || dp[i - 1][j];
        } else {
          //情况4:s当前位置和p前2个位置不匹配,则相当于*重复了0次
          //例如 s='XXXb' p='XXXa*' 当前位置的状态和p向前看2个位置的状态相同
          dp[i][j] = dp[i][j - 2];
        }
      }
    }
  }
  return dp[sLen][pLen]; // 长为sLen的s串 是否匹配 长为pLen的p串
};

 

标签:10,匹配,正则表达式,sLen,位置,pLen,XXXa,dp
From: https://www.cnblogs.com/yadayou/p/17849751.html

相关文章

  • GMK15100-ASEMI光伏二极管GMK15100
    编辑:llGMK15100-ASEMI光伏二极管GMK15100型号:GMK15100品牌:ASEMI正向电流:15A反向耐压:100V封装:批号:2023+引脚数量:2工作温度:-55°C~125°CGMK15100特征:肖特基势垒高二极管;热阻低;正向压降低,功率损耗低隔离包装设计,非常适合散热;高正向电流能力;优异的抗湿性;低调的包装;......
  • mysql无法登陆,报错ERROR 1045 (28000): Access denied for user 'root'@'localhost' (
    问题描述在使用命令行登录MySQL时出现了下述问题: 出错原因usingpassword:NO:表示输入没有输入密码就尝试登陆了usingpassword:YES:表示输入了密码,但密码错误 解决方案:修改密码1.修改mysql配置文件my.cnf。在 [mysqld]增加skip-grant-tables 无密码进入mys......
  • GMK10100-ASEMI光伏二极管GMK10100
    编辑:llGMK10100-ASEMI光伏二极管GMK10100型号:GMK10100品牌:ASEMI正向电流:10A反向耐压:100V封装:批号:2023+安装类型:表面贴装型引脚数量:2工作温度:-55°C~150°C类型:光伏二极管GMK10100特性:肖特基势垒高二极管;热阻低;正向压降低,功率损耗低隔离包装设计,非常适合散热;高正......
  • uniapp app上传图片并设置超过10m进行图片压缩
    组件页面<template>   <viewclass="upload-wrapper">      <viewv-if="pictureUrl.length">         <viewclass="preview"v-for="(item,index)inpictureUrl":key='index'>        ......
  • 面试必刷TOP101:30、二叉搜索树与双向链表
    题目题解/*思路:首先根节点以及其左右子树,左子树的左子树和右子树的右子树相同*左子树的右子树和右子树的左子树相同即可,采用递归*非递归也可,采用栈或队列存取各级子树根节点*/publicclassSolution{ booleanisSymmetrical(TreeNodepRoot) { if(pRoot==null){ re......
  • Codeforces Round 910 E
    tilian我们发现可以通过交换相邻两个的方式让字典序小的任意移动我们目标串t要是t[0]为c我们肯定是找到第一个合法的c的位置每次去找合法并且最优的那么哪些是不合法的呢比如我比c小的a,b位置还在第一个c前肯定就不能用了我们用26个set维护这个过程即可voidsolve()......
  • 10、Redis哨兵(sentinel)【面试重点】
    一、是什么二、能干嘛三、怎么玩(案例演示实战步骤)1、RedisSentinel架构,前提说明2、案例步骤2.1sentinel.conf文件位置2.2重点参数项说明2.3本次案例哨兵sentinel文件通用配置2.4先启动一主二从3个redis实例,测试正常的主从复制以下是哨兵......
  • 10-基础SQL-DQL(数据查询语言)-排序查询(ORDER BY)
    DQL-介绍(常用)DQL英文全称是DataQueryLanguage(数据查询语言),数据查询语言用来查询数据库中表的记录查询关键字:SELECTDQL-语法......
  • 学习笔记10
    关于知识点知识点归纳第十二章块设备I/O和缓冲区管理12.1块设备I/O缓冲区块设备I/O缓冲区是内存中用于临时存储数据的区域,用于处理块设备的读写操作。在进行块设备读取时,数据会被先存储到I/O缓冲区,然后再通过内核将数据传输到用户空间。而在进行块设备写入时,数据也会首先......
  • 二分图最大匹配的必须边和可行边
    以下考虑完备匹配(非完备匹配要用到网络流)给定一张二分图,其最大匹配方案不一定是唯一的。若任何一个最大匹配方案的匹配边都包括\((x,y)\),则称\((x,y)\)为二分图匹配的必须边。若\((x,y)\)至少属于一个最大匹配的方案,则称\((x,y)\)为二分图匹配的可行边以下证明假设我们已经求出......