力扣 题目44- 通配符匹配

题目


题解(来自力扣评论区大佬)


 

ps:动态规划还是难啊 没想出来 哭了

力扣 题目10-正则表达式匹配 下--这题有点难 中使用了动态规划法 即保留之前的结果  在遍历到当前结果时 根据某种规律去找上一次是否匹配 那么这题也是一样 不清楚的可以看这篇

大部分细节一致 可以直接看代码理解

代码 

 1 #include<iostream>
 2 #include<string>
 3 #include <vector>
 4 using namespace std;
 5 class Solution {
 6 public:
 7     bool isMatch(string s, string p) {
 8         int m = s.size(), n = p.size();
 9         vector<vector<bool>> dp(m + 1, vector<bool>(n + 1));
10         //dp[0][0]:什么都没有, 所以为true
11         dp[0][0] = true;
12         //当i为0 j取到*时 应该和j - 1一样
13         for (int j = 1; j <= n; j++) {
14             if (p[j-1] == '*') {
15                 dp[0][j] = dp[0][j - 1];
16             }
17         }
18         for (int i = 1; i <= m; i++) {
19             for (int j = 1; j <= n; j++) {
20                 //当s[i-1] == p[j - 1] 即p为数字的情况
21                 //p[j - 1] == '?' 即p为?号的情况
22                 if (s[i-1] == p[j - 1] || p[j - 1] == '?') {
23                     //s[i-1] == p[j - 1]和p[j - 1] == '?'都可以看成一种情况 即匹配一次 
24                     //所以dp[i][j] = dp[i - 1][j - 1];
25                     dp[i][j] = dp[i - 1][j - 1];
26                 }
27                 //p[j - 1] == '*' 即p为*号的情况
28                 else if (p[j - 1] == '*') {
29                     //*可以代表不匹配即匹配0次 即dp[i][j - 1] 或者一次以上匹配dp[i - 1][j]
30                     dp[i][j] = dp[i][j - 1] || dp[i - 1][j];
31                 }
32             }
33         }
34         return dp[m][n];
35     }
36 };
37 
38 int main() {
39     Solution sol;
40     bool zheng = sol.isMatch("adceb", "*a*");
41     cout << zheng << endl;
42 
43 }
View Code

 

posted @ 2022-05-06 13:04  无聊的阿库娅  阅读(23)  评论(0编辑  收藏  举报