力扣 题目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 }