码迷,mamicode.com
首页 > 其他好文 > 详细

44. 通配符匹配

时间:2020-05-02 23:19:47      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:匹配   lse   class   string   int   返回   code   public   初始   

 1 class Solution 
 2 {
 3     // 状态 dp[i][j] : 表示 s 的前 i 个字符和 p 的前 j 个字符是否匹配 (true 的话表示匹配)
 4     // 状态转移方程:
 5     //      1. 当 s[i] == p[j],或者 p[j] == ? 那么 dp[i][j] = dp[i - 1][j - 1];
 6     //      2. 当 p[j] == * 那么 dp[i][j] = dp[i][j - 1] || dp[i - 1][j]    其中:
 7     //      dp[i][j - 1] 表示 * 代表的是空字符,例如 ab, ab*
 8     //      dp[i - 1][j] 表示 * 代表的是非空字符,例如 abcd, ab*
 9     // 初始化:
10     //      1. dp[0][0] 表示什么都没有,其值为 true
11     //      2. 第一行 dp[0][j],换句话说,s 为空,与 p 匹配,所以只要 p 开始为 * 才为 true
12     //      3. 第一列 dp[i][0],当然全部为 false
13 public:
14     bool isMatch(string s, string p) 
15     {
16         int m = s.length();
17         int n = p.length();
18 
19         // 状态 dp[i][j] : 表示 s 的前 i 个字符和 p 的前 j 个字符是否匹配
20         vector<vector<int>> dp(m + 1,vector<int>(n + 1,0));
21         // 初始化
22         dp[0][0] = true;
23         for (int j = 1; j <= n; j++) 
24         {
25             if(p[j - 1] == *) dp[0][j] = dp[0][j - 1];
26         }
27 
28         // 状态转移
29         for (int i = 1; i <= m; i++) 
30         {
31             for (int j = 1; j <= n; j++) 
32             {
33                 if (s[i - 1] == p[j - 1] || p[j - 1] == ?) 
34                 {
35                     dp[i][j] = dp[i - 1][j - 1];
36                 } 
37                 else if (p[j - 1] == *) 
38                 {
39                     dp[i][j] = dp[i][j - 1] || dp[i - 1][j - 1] || dp[i - 1][j];
40                 }
41             }
42         }
43         
44         // 返回结果
45         return dp[m][n];
46     }
47 };

 

44. 通配符匹配

标签:匹配   lse   class   string   int   返回   code   public   初始   

原文地址:https://www.cnblogs.com/yuhong1103/p/12819857.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!