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

10_正则表达式匹配

时间:2022-11-24 00:34:05浏览次数:37  
标签:aa 10 匹配 space 正则表达式 字符串 FALSE TRUE dp

10.正则表达式匹配

一、题目内容

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

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

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

示例 1
输入:s = "aa", p = "a"
输出:false
解释:"a" 无法匹配 "aa" 整个字符串。
示例 2
输入:s = "aa", p = "a*"
输出:true
解释:因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。
示例 3
输入:s = "ab", p = ".*"
输出:true
解释:".*" 表示可匹配零个或多个('*')任意字符('.')。
提示
  • 1 <= s.length <= 20
  • 1 <= p.length <= 30
  • s 只包含从 a-z 的小写字母。
  • p 只包含从 a-z 的小写字母,以及字符 .*
  • 保证每次出现字符 * 时,前面都匹配到有效的字符

二、分析题目

动态规划方法解题

​ 针对问题考虑采用动态规划方法解题,采用DP二维布尔值数组进行讨论。针对该问题需要讨论不同情况的特殊情况下面取以下几个例子,满足以上几个例子即可完成所有。

情况一

s和p对应字符串表

S a a
P a

DP数组对应表

0 1 3
0 TRUE | FALSE a| FALSE aa|
1 FALSE |a TRUE a|a FALSE aa|a
情况二

s和p对应字符串

S a a
P a *

DP数组对应表

0 1 2
0 TRUE | FALSE a| FALSE aa|
1 FALSE |a TRUE a|a FALSE aa|a
2 TRUE |a* TRUE a|a* TRUE aa|a*
情况三

s和p,对应的字符串

S a a
P . *

DP数组对应表

0 1 2
0 TRUE | FALSE a| FALSE aa|
1 FALSE |. TRUE a|. FALSE aa|.
2 TRUE |.* TRUE a|.* TRUE aa|.*
情况四

在这种情况需要考虑.二者出现时,根据性质,删除.**的情况。

s和p,对应的字符串:

S a b
P a . * b

DP数组对应表

0 1 2
0 TRUE | FALSE a| FALSE ab|
1 FALSE |a TRUE a|a FALSE ab|a
2 FALSE |a. FALSE a|a. TRUE ab|a.
3 FALSE |a.* TRUE a|a.* TRUE ab|a.*
4 FALSE |a.*b FALSE a|a.*b TRUE ab|a.*b
综合总结状态转移方程如下

$$
dp[i][j] =
\begin{cases}
dp[i-1][j-1],& s[i-1] = p[j-1] \space or \space p[j-1]=''\
dp[i-1][j]\space or \space dp[i][j-2], & p[j-1] ='
' \space and \space (s[i-1]=p[j-2]\space or \space p[j-2]='.') \
dp[i][j-2],& p[j-1] ='*' \space and \space not \space (s[i-1]=p[j-2]\space or \space p[j-2]='.')\
\end{cases}
\s.t. i>0, j>0
$$

三、代码

public boolean isMatch(String s, String p) {
    // 转为字符串数组 AS AP
    char[] AS = s.toCharArray(), AP = p.toCharArray();

    // dp[i][j] boolean组 默认值为false
    boolean[][] dp = new boolean[AS.length + 1][AP.length + 1];
    dp[0][0] = true;
	
    // 初始化 j=0 的dp
    for (int i=1; i<=AP.length; i++){
        if (AP[i-1] == '*')
            dp[0][i] = dp[0][i-2];
    }

    for (int i=1; i<=AS.length; i++){
        for (int j=1; j<=AP.length; j++){
            if (AS[i-1] == AP[j-1] || AP[j-1] == '.'){
                dp[i][j] = dp[i-1][j-1];
            }else if(AP[j-1] == '*'){
                if (AP[j-2] == AS[i-1] || AP[j-2] == '.'){
                    // 保留或舍去
                    dp[i][j] =  dp[i-1][j] || dp[i][j-2];
                }else{
                    dp[i][j] = dp[i][j-2];
                }
            }
        }
    }
    return dp[AS.length][AP.length];
}

标签:aa,10,匹配,space,正则表达式,字符串,FALSE,TRUE,dp
From: https://www.cnblogs.com/vvvigo/p/16907078.html

相关文章

  • 010.路径表达式用法
    1.加载单个配置文件  2.加载多个配置文件  3.路径表达式的书写方法 ......
  • Win10 修改系统自带字体
    文章来源:Win10怎样更改系统字体?Win10默认字体修改教程-系统之家(xitongzhijia.net)苹方字体下载,window系统专用【2021最新版】免费下载-知乎(zhihu.com) 修改后......
  • 3d激光雷达开发(ndt匹配)
        除了icp匹配之外,ndt匹配也是使用比较多的一种方法。相比较icp而言,ndt匹配花的时间要少一些。此外,ndt匹配还需要输入估计的yaw、pitch、roll、x、y、z,这个可以根......
  • 3d激光雷达开发(icp匹配)
        所谓匹配,其实就是看两个点云数据里面,哪些关键点是一样的。这样就可以把一个点云移动到另外合适的位置,组成一个新的点云。一般来说,单个机器人上面,3d激光扫描到的......
  • Luogu3410 & 2762 - 最小割 -
    题目链接:https://www.luogu.com.cn/problem/P3410题解:建图就形如这样的:其中左边的点表示客户要求,右边的点表示下属S->左边点断一条边,就说明dismiss这个要求,右边点......
  • SAP oracle 复制新实例后数据库远程连接报错 ora-01031
    问题:oracle 服务器本地用sqlplus 可以用sys 作为dba 登入,但是用 pl/sql登入时就报ORA-01031insufficientprivileges错误。如下图。 这个问题的原因是,......
  • 怎么定义正则表达式
    怎么定义正则表达式字面量定义,就是用两个"/"把表达式包裹起来。字面量定义的正则表达式可以赋值给变量,也可以在需要用到正则表达式的地方直接使用。//赋值给变量var......
  • 【221123-7】计算(2-根号3)的1002次方乘以(7+4倍根号3)的501次方
    ......
  • AIR32F103(六) ADC,I2S,DMA和ADPCM实现录音播放功能
    目录AIR32F103(一)合宙AIR32F103CBT6开发板上手报告AIR32F103(二)Linux环境和LibOpenCM3项目模板AIR32F103(三)Linux环境基于标准外设库的项目模板AIR32F103(四)2......
  • 数据结构(二):括号匹配(C++,栈)
    好家伙,写题,题目代码在最后 来吧,  1.栈 栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一......