Regular Expression Matching

用动态规划

思想是:每次计算后都保存当前的运行结果

f[i][j]表示串s[0···i-1]与从串p[0···j-1]的比较结果

首先,f[0][0]表示两空串比较结果为真    f[0][0]=true;

其次,当原串不为空时,无论p串是什么结果都为真,即f[i][0]=false;  而当原串为空时,需考虑p串的p[j-1]是否等于‘*’,当等于时再考虑p[j-3]是否已经与空串比较为真即f[0][j-2]

最后,以上是边界条件,真个过程中通过判断p[j-1]是否为‘*’,分为两种情况:

                                                                      否:比较简单,直接比较p[j-1]与s[i-1],或者p[j-1]为'.',注意还要加上之前f[i-1][j-1]

                                                                      是:第一种,s[i-1]已与p[j-3]前面的串都相同,则f[i][j-2]就可以了;第二种,判断s[i-1]与p[j-2]比较相同,再加上之前的串f[i-1][j]

 1 class Solution {
 2 public:
 3     bool  isMatch(string s, string p){
 4      int lens=s.length();
 5      int lenp=p.length();
 6      vector<vector<bool>> f(lens+1,vector<bool>(lens,false));
 7      f[0][0]=true;
 8      for(int i=1;i<=lens;i++)
 9          {
10             f[i][0]=false;
11          }
12      for(int j=1;j<lenp;j++)
13          {
14            f[0][j]=j>1&&p[j-1]=='*'&&f[0][j-2];
15          }
16      for(int i=0;i<lens;i++)
17          for(int j=0;j<lenp;j++)
18              {
19                if(p[j-1]!='*')
20                    {
21                        f[i][j]=f[i-1][j-1]&&(p[j-1]==s[i-1]||p[j-1]=='.');
22                    }
23                else
24                    f[i][j]=f[i][j-2]||(s[i-1]==p[j-2]||'.'==p[j-2])&&f[i-1][j];
25              }
26     }
27 };
原文地址:https://www.cnblogs.com/daocaorenblog/p/5214261.html