zoukankan      html  css  js  c++  java
  • 51正则表达式匹配

    题目描述

    请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配。
     
     
    思路:
    首先题目要理解,通配符*是重复前面一个元素,而不是*前面所有的元素而且通配符*号前面必须要有元素,就是说*出现的位置不可能在第一位。
    f[i][j] = f[i][j - 2] || (s[i - 1] == p[j - 2] || '.' == p[j - 2]) && f[i - 1][j];

    f[i][j - 2]表示前面的元素出现0次,后面表示出现次数大于等于1.

    aabbb

    aab.*

    能够出现多次,说明s中减少一个(i -1)也能匹配,所以这个条件也必须满足。

    s[i - 1] == p[j - 2]因为ij表示出现的元素个数,相当于下标从i - 1,j - 1.
    表示p中倒数第二个元素要和s中倒数第一个元素相等。这样才能进行重复。
    注意初始化第一列的情况。

    class Solution {
    public:
        bool match(char* str, char* pattern){
            int n = strlen(str),m = strlen(pattern);
            vector<vector<int>> dp(n + 1,vector<int> (m + 1,false));
            
            dp[0][0] = true;
            for(int i = 1;i <= n;++i){
                dp[i][0] = false;
            }
            for(int j = 1;j <= m;++j){
                if(j > 1 && (j % 2 == 0) && (pattern[j - 1] == '*') && dp[0][j - 2] ){
                    dp[0][j] = true;
                }
            }
            for(int i = 1;i <= n;++i){
                for(int j = 1;j <= m;++j){
                    if(pattern[j - 1] != '*'){
                        dp[i][j] = (str[i - 1] == pattern[j - 1] || pattern[j - 1] == '.') && dp[i - 1][j - 1];                                        
                    }
                    else{
                        dp[i][j] = dp[i][j - 2] || (str[i - 1] == pattern[j - 2] || pattern[j - 2] == '.') && dp[i - 1][j];                    
                    }
                }
            }
            return dp[n][m];
        }
    };



  • 相关阅读:
    [BZOJ3751] [NOIP2014] 解方程 (数学)
    [BZOJ4198] [Noi2015] 荷马史诗 (贪心)
    [BZOJ4034] [HAOI2015] T2 (树链剖分)
    [BZOJ1880] [Sdoi2009] Elaxia的路线 (SPFA & 拓扑排序)
    [BZOJ1088] [SCOI2005] 扫雷Mine
    [BZOJ1004] [HNOI2008] Cards (Polya定理)
    [BZOJ1009] [HNOI2008] GT考试 (KMP & dp & 矩阵乘法)
    [BZOJ1503] [NOI2004] 郁闷的出纳员 (treap)
    [BZOJ1059] [ZJOI2007] 矩阵游戏 (二分图匹配)
    BZOJ2626: JZPFAR
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/8282430.html
Copyright © 2011-2022 走看看