10. 正则表达式匹配

 1 // 1、当s[i] == p[j]时,dp[i][j] = dp[i - 1][j - 1]
 2 // 2、当p[j] == '.'时,dp[i][j] = dp[i - 1][j - 1] 
 3 // 3、当p[j] == '*'时,
 4 //     3.1、当s[i] != p[j - 1]时,dp[i][j] = dp[i][j - 2]
 5 //     3.2、当s[i] == p[j - 1] || p[j - 1] == '.'时,
 6 //         3.2.1、匹配0个. dp[i][j] = dp[i][j - 2]
 7 //         3.2.2、匹配1个. dp[i][j] = dp[i - 1][j - 2]
 8 //         3.2.3、匹配多个.dp[i][j] = dp[i - 1][j]
 9 class Solution 
10 {
11 public:
12     bool isMatch(string s, string p) 
13     {
14         int m = s.size(), n = p.size();
15         vector<vector<bool>> dp(m + 1,vector<bool>(n + 1,false));
16         // s和p都是空串的时候自然true
17         dp[0][0] = true;
18         
19         // 初始化首列
20         for(int i = 1; i <= m; i++) dp[i][0] = false;
21         
22         // 初始化首行
23         for(int j = 1; j <= n; j++)
24         {
25             if(j != 1 && p[j - 1] == '*') dp[0][j] = dp[0][j - 2];
26         }
27 
28         // 通过递推公式开始填充矩阵
29         for(int i = 1; i <= m; i++)
30         {
31             for(int j = 1; j <= n; j++)
32             {
33                 if(p[j - 1] != '*')
34                 {
35                     if(s[i - 1] == p[j - 1] || p[j - 1] == '.') dp[i][j] = dp[i - 1][j - 1];
36                 }
37                 else
38                 {
39                     if(j > 1)
40                     {
41                         if(s[i - 1] == p[j - 2] || p[j - 2] == '.')
42                         {
43                             dp[i][j] = dp[i - 1][j] || dp[i][j - 2] || dp[i - 1][j - 2];
44                         }
45                         else
46                         {
47                             dp[i][j] = dp[i][j - 2];
48                         }
49                     }
50                 }
51             }
52         }
53         return dp[m][n];
54     }
55 };

 

posted @ 2020-05-09 10:34  Jinxiaobo0509  阅读(156)  评论(0)    收藏  举报