• 【动态规划】正则表达式匹配


    【题目链接】:

    https://www.acwing.com/problem/content/28/

    【题目解释】

    请实现一个函数用来匹配包括'.''*'的正则表达式。

    模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。

    在本题中,匹配是指字符串的所有字符匹配整个模式。

    例如,字符串"aaa"与模式"a.a""ab*ac*a"匹配,但是与"aa.a""ab*a"均不匹配。

    样例

    输入:
    
    s="aa"
    p="a*"
    
    输出:true

    【参考】y总的视频讲解。

    分3种情况来讨论问题,f[i][j] 以i为结尾的s串是否匹配以j为结尾的p串。

    具体可以看代码:

     1 /*
     2 s="aa"
     3 p="a*"
     4 
     5 f[i][j] 指的是: s[i,...] p[j,...] 相匹配
     6 
     7 1. 当p[i] 是正常的字符 , s[i] == p[j] , f[i][j] = f[i+1][j+1]
     8 2. 当p[i] = '.' ,  f[i][j] = f[i+1][j+1]
     9 3. 当p[i+1] = '*' ,f[i][j] = f[i][j+2] || f[i+1][j]
    10 
    11 
    12 边界问题 : f[n][m] = true;
    13 */
    14 
    15 
    16 
    17 class Solution {
    18 public:
    19     string s , p  ;
    20     vector< vector<int > > f ;
    21     int n, m ;
    22     bool isMatch(string _s, string _p) {
    23         s = _s , p = _p ;
    24         n = s.length() , m = p.length() ;
    25         f = vector<vector<int>>( n+2 , vector<int> ( m+2 , -1 ) );
    26         return dp(0,0);
    27     }
    28     bool dp(int x,int y){
    29         if( f[x][y] != -1 ) return f[x][y] ;
    30         if( y == m )    return (f[x][y] = (x==n));
    31         bool First = (x < n && (p[y] == '.' || s[x] == p[y]) ) ; 
    32         
    33         if( y+1 < m && p[y+1] == '*' ){
    34             f[x][y] = dp(x,y+2) || First && dp(x+1,y);
    35         }else{
    36             f[x][y] =  First && dp(x+1,y+1);
    37         }
    38         return f[x][y];
    39     }
    40 };
     
  • 相关阅读:
    DIV高度设置全屏
    Yii2使用PHPExcel读取excel
    关于linux centos7 vmware 和windows7 文件共享笔记
    mysql rpm包安装
    linux crontab 计划任务脚本
    linux php5.6 安装
    linux上安装php phpredis扩展
    让微信小程序每次请求的时候不改变session_id的方法
    mysql主从配置
    mysql存储过程之游标遍历数据表
  • 原文地址:https://www.cnblogs.com/Osea/p/11380772.html
Copyright © 2020-2023  润新知