• 剑指offer:正则表达式匹配


    题目描述:

    请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配

    思路分析:

    这里要注意审题,一开始看的时候以为是两个模式串的匹配。后来发现一个就是普通的字符串,而另一个才是所谓的模式串,即包含了'.'和'*'。

    这类题目需要考虑的比较全面,对各个情况进行分析,并没有太多的技巧点和算法在其中,用到的就是递归。具体的解析在注释当中有进行说明。

    思路二:

    在刷leetcode时,遇到了类似题目,看一些题解中用到了动态规划的解法,相对于上述思路,代码更简洁。dp数组从往前做匹配,同样去判断当前的模式串是否是带*的形式,若是,dp[i][j]=dp[i][j+2] ||( (p[j] == '.' || p[j] == s[i])&& dp[i+1][j]), 即这个带*模式串为空,或当前所值字符对应相等且前一位也相等。否则dp[i][j] = (p[j] == '.' || p[j] == p[i]) && dp[i+1][j+1],即不带有*时,就需要比较二者的前一位和当前位置的匹配做与操作。

    代码:

     1 class Solution {
     2 public:
     3     bool match(char* str, char* pattern)
     4     {
     5         // 若为空指针,则返回false
     6         if(str==nullptr || pattern==nullptr)
     7             return false;
     8         return matchCore(str, pattern);
     9     }
    10     
    11 private:
    12     bool matchCore(char* str, char* pattern)
    13     {
    14         // 若都走到结尾,则返回true
    15         if(*str=='' && *pattern=='')
    16             return true;
    17         // 字符串没到结尾,而模式串到了,则返回false
    18         if(*str!='' && *pattern=='')
    19             return false;
    20         // 字符串到了结尾,而模式串没到,则需要继续判断,对后续'*'做处理
    21         if(*(pattern+1)=='*')
    22         {
    23             // 若当前字符串与模式串匹配或模式串为'.'且字符串不到结尾
    24             if(*str==*pattern || (*pattern=='.' && *str!=''))
    25             {
    26                 // 只匹配当前的这个字符后,跳过模式串的'*'
    27                 return matchCore(str+1, pattern+2) || 
    28                     // 继续对后续的字符匹配'*'
    29                     matchCore(str+1, pattern) ||
    30                     // 当前字符也不对'*'匹配,跳过这个模式
    31                     matchCore(str, pattern+2);
    32             }
    33             // 否则,当前的字符与模式不匹配,则跳过'*'这个模式
    34             else
    35             {
    36                 return matchCore(str, pattern+2);
    37             }
    38         }
    39         // 当前的模式串没有'*',则需要判断模式串和字符串是否相等,或判断模式串为'.'且字符串不到末尾
    40         if(*str==*pattern || (*pattern=='.' && *str!=''))
    41         {
    42             return matchCore(str+1, pattern+1);
    43         }
    44         return false;
    45     }
    46 };

    思路二:

     1 class Solution {
     2 public:
     3     bool isMatch(string s, string p) {
     4         int m = s.size();
     5         int n = p.size();
     6         vector<vector<bool>>dp(m+1, vector<bool>(n+1));
     7         for(int i = m; i>=0; i--)
     8         {
     9             for(int j = n; j>=0; j--)
    10             {
    11                 if(i == m && j== n)
    12                 {
    13                     dp[i][j] = true;
    14                     continue;
    15                 }
    16                 else
    17                 {
    18                     if(j<n-1 && p[j+1] == '*')
    19                     {
    20                         dp[i][j] = dp[i][j+2] || (i<m && (p[j] == '.' || p[j] == s[i]) && dp[i+1][j]);
    21                     }
    22                     else
    23                     {
    24                         dp[i][j] = i<m && (p[j] == '.' || p[j] == s[i]) && dp[i+1][j+1];
    25                     }
    26                 }
    27             }
    28         }
    29         return dp[0][0];
    30     }
    31 };
  • 相关阅读:
    C# 3.0新特性
    WinForm上显示gif动画
    Sql Server中Case函数的使用(上篇)转载
    Jquery的$命名冲突:
    Sql Server中case函数的使用(下篇) 转载
    hdu 2544 2066 1874 2680
    伤感!
    hdu 1999 不可摸数
    hdu 1878欧拉回路
    hdu 2767
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/11100371.html
Copyright © 2020-2023  润新知