1. 题目描述

  请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配。
2. 特殊说明
  (1)这题和hdu6170题目一样。但是不同的是,对于下面这种情况:
ab
.*

  hdu6170判断为false,牛客网判断为true。实际上,在正则表达式里面,这个匹配结果也是true。

3. 解体思路
  不妨令第一个串名字为$a$,长度为$n$;第二个串名字为$b$,长度为$m$。不难想到用$dp[i][j]$表示字符串$a$的前$i$个字符(这是口语化表达,前一个就是$a[0]$和$b[0]$)已经匹配,然后再转移到其他情况。显然,$dp[0][0]=true$,我们要的答案为$dp[n][m]$。
  我们枚举串$a$和$b$的所有字符,设当前考虑的是$a$的第$i$个字符($a[i-1]$)和$b$的第$j$个字符($b[j-1]$)的匹配情况,那么,对于$b[j-1]$而言,有如下几种情况:
  (1)$b[j-1]=='*'$:这时,又有如下几种情况:
    ①$b[j-2]$和$b[j-1]$合起来匹配$a$串的$0$个字符:转移式子为:$$dp[i][j]=dp[i][j-2]$$
    ②$b[j-2]$和$b[j-1]$合起来匹配$a$串的$1$个字符:转移式子为:$$dp[i][j]=dp[i-1][j-2]\&\&a[i-1]==b[j-2]$$
    ③$b[j-2]$和$b[j-1]$合起来匹配$a$串的$2$个字符以上:转移式子为:$$dp[i][j]=dp[i-1][j]\&\&a[i-2]==a[i-1]\&\&a[i-1]==b[j-2]$$
    ④考虑上面说明的特殊情况,如果$b[j-2]=='.'$,这时的$.*$组合也会出现上面三种情况,第一种情况和①一样,后面两种情况转移式子为:$$dp[i][j]=dp[i-1][j-1]|dp[i-1][j]$$
  (2)$b[j-1]=='.'$:这时,转移式子为:$$dp[i][j]=dp[i-1][j-1]$$
  (3)$b[j-1]$为普通字母:这时,转移式子为:$$dp[i][j]=dp[i-1][j-1]\&\&a[i-1]==b[j-1]$$
  然后,注意边界控制,只要保证数组下标不会越界(负越界和正越界)即可。
4. 参考代码
class Solution {
public:
    int n,m;
    ][];
    bool match(char* str, char* pattern){
        char *a=str,*b=pattern;
        n=strlen(a);
        m=strlen(b);
        &&m==)return false;
        ;i<=n;++i)fill(dp[i],dp[i]+m+,false);
        dp[][]=true;
        ;i<=n;++i){
            ;j<=m;++j){
                ]=='*'){
                    )dp[i][j]|=dp[i][j-];//对应情况(1).①和(1).④
                    &&j>=)dp[i][j]|=dp[i-][j-]&&a[i-]==b[j-];//对应情况(1).②
                    &&j>=)dp[i][j]|=dp[i-][j]&&a[i-]==a[i-]&&a[i-]==b[j-];//对应情况(1).③
                    &&b[j-]==][j-]|dp[i-][j];//对应情况(1).④
                }
                &&b[j-]==][j-];//对应情况(2)
                )dp[i][j]|=dp[i-][j-]&&(a[i-]==b[j-]||b[j-]=='.');//对应情况(3)
            }
        }
        return dp[n][m];
    }
};
 
 
 

牛客网剑指Offer——正则表达式匹配的更多相关文章

  1. 正则表达式匹配 牛客网 剑指Offer

    正则表达式匹配 牛客网 剑指Offer 题目描述 请实现一个函数用来匹配包括'.'和''的正则表达式.模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(包含0次). 在本题中, ...

  2. 数组中只出现过一次的数字 牛客网 剑指Offer

    数组中只出现过一次的数字 牛客网 剑指Offer 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了偶数次.请写程序找出这两个只出现一次的数字. def FindNumsAppearOnce ...

  3. 数组中出现次数超过一半的数字 牛客网 剑指Offer

    数组中出现次数超过一半的数字 牛客网 剑指Offer 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字 ...

  4. 数据流中的中位数 牛客网 剑指Offer

    数据流中的中位数 牛客网 剑指Offer 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就 ...

  5. 数字在排序数组中出现的次数 牛客网 剑指Offer

    数字在排序数组中出现的次数 牛客网 剑指Offer 题目描述 统计一个数字在排序数组中出现的次数. class Solution: def GetNumberOfK(self, data, k): i ...

  6. 数值的整数次方 牛客网 剑指Offer

    数值的整数次方 牛客网 剑指Offer 题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方 class Solution: #run ...

  7. 按之字形顺序打印二叉树 牛客网 剑指Offer

    按之字形顺序打印二叉树 牛客网 剑指Offer 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推 ...

  8. 把数组排成最小的数 牛客网 剑指Offer

    把数组排成最小的数 牛客网 剑指Offer 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能 ...

  9. 把字符串转换成整数 牛客网 剑指Offer

    把字符串转换成整数 牛客网 剑指Offer 题目描述 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串 ...

随机推荐

  1. nakadi-ui nakadi event broker 的可视化UI工具

    nakadi 是一款很不错的基于fafka 开发的event broker ,我们只需要使用http 请求就可以调用kafka 方便的发布订阅功能 环境准备 docker-compose 文件 ver ...

  2. Bat相关的项目应用

    原 bat 命令如何启动远程PC上的一个程序? 原 bat 自动解压缩,发布asp.net程序 原 bat 自动更新代码,编译,压缩asp.net程序 原 bat自动备份压缩文件 原 bat命令ora ...

  3. Zabbix-2.4-安装-4

    Zabbix api 对于以上两种方式,有些人都不选,倾向于使用第三种:使用zabbix api加上这个监控在把这台机器删除了,然后discovery和自动注册的都关闭了再换一种方式把它加进去,zab ...

  4. TypeScript 之 模块

    https://m.runoob.com/manual/gitbook/TypeScript/_book/doc/handbook/Modules.html 外部模块简写 外部模块简写:declare ...

  5. pycharm开发django项目 static报404解决方法

    settings文件中确保有以下配置 # Static files (CSS, JavaScript, Images)# https://docs.djangoproject.com/en/1.10/ ...

  6. JS replace()用法实现replaceAll

    由于js没有提供replaceAll,则使用正则表达式实现全局替换. javascript中replace() 方法如果直接用str.replace("-","!&quo ...

  7. 深入理解ASP.NET MVC(6)

    系列目录 Action全局观 在上一篇最后,我们进行到了Action调用的“门口”: 1 if (!ActionInvoker.InvokeAction(ControllerContext, acti ...

  8. Hive介绍和Hive环境搭建

    一.Hive介绍 Hive包含用户接口.元数据库.解析器和数据仓库等组件组成,其中用户接口包含shell客户端.JDBC.ODBC.Web接口等.元数据库主要是指定义在hive中的表结构信息,一般保存 ...

  9. PHP用ActiveMq 实现消息列队

    1.各种安装 2.简单配置: jetty.xml localhost:8161 配置: activemq添加stomp的61613接口 conf/activemq.xml <transportC ...

  10. Windows Azure Virtual Machine (36) 扩展Azure ARM VM的磁盘大小

    <Windows Azure Platform 系列文章目录> 在默认情况下,Azure ARM VM的操作系统磁盘(OS Disk),容量为: (1)Windows VM OS Disk ...