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. tile38 server 密码保护

    默认tile38 是没有密码保护的,我们可以通过配置指定密码,类似redis 的,但是redis 的一般我们是配置在 配置文件中的 环境准备 docker-compose 文件   version: ...

  2. Singer 学习十一 配置以及状态管理

    配置和状态文件通过提供身份验证信息,开始时间和有关以前调用的信息,帮助为Taps和Targets提供上下文 配置文件 配置文件包含tap 运行需要的信息,通常包含API,以及数据源的凭据 特殊字段 s ...

  3. 使用nexus 管理pip 私有包

    nexus 已经支持了对于python pip 包的管理(支持group,host,proxy) 这个是一个简单的使用docker 运行的demo,同时集成了s3 存储,以及 一个为了测试简单的自定义 ...

  4. python结合redis模拟队列

    实在无聊就写了个很小的python程序用来实现模拟redis队列的代码如下: redis_lpush.py   #!/usr/bin/python3 import time import redis ...

  5. Linux期末复习题

    版权声明: https://blog.csdn.net/u014483914/article/details/36622451 1.More和less命令的差别         More命令通经常使用 ...

  6. Javascript高级调试——console.table()

    原文:http://www.mariusschulz.com/2013/11/13/advanced-javascript-debugging-with-consoletable 本文只是简单翻译,部 ...

  7. Python的itertools模块

    本章将介绍Python自建模块itertools,更多内容请参考:Python参考指南 python的自建模块itertools提供了非常有用的用于操作迭代对象的函数. 首先,我们看看itertool ...

  8. Java Dom4j XML用法总结

    1.新建XML文档:              Document doc = DocumentHelper.createDocument();             Element root = d ...

  9. 开通mysql root 用户远程访问权限(转)

    基于安全考虑root账户一般只能本地访问,但是在开发过程中可能需要打开root的远程访问权限.下面是基本的步骤:1.登录到mysql中,为root进行远程访问的授权,执行下面的命令: mysql> ...

  10. 基于MVC4+EasyUI的Web开发框架形成之旅(6)--基类控制器CRUD的操作

    在上一篇随笔中,我对Web开发框架的总体界面进行了介绍,其中并提到了我的<Web开发框架>的控制器的设计关系,Web开发框架沿用了我的<Winform开发框架>的很多架构设计思 ...