
方法一:动态规划
这个问题和之前一个题目类似,最先想到的是动态规划。
从后向前分析,看最后一个字母是否匹配
- 如果最后一个字母不匹配,那么匹配失败,最终结果就是 false
- 如果最后一个字母匹配,那么继续向前匹配,如果匹配成功再继续向前匹配,知道匹配失败或者全部匹配完毕。
因为题目中有两个字符串,是否匹配也只有一个唯一的答案 true or false ,所以我们可以使用一个二维数组存放是否匹配。就是说 dp[i][j]= true 的意思是字符串 s 中的前 i 个元素和匹配字符串 p 的前 j 个元素是匹配的。
那么怎么判定是否匹配呢?分三种情况
- 如果为两个字母:直接比较字母是否相等
- 如果为
?那么就认为字符串s[i]和p[j]匹配成功 - 如果是
*也是最复杂的一种情况- 匹配 0 个字符
dp[i][j - 1] - 匹配多个字符
dp[i - 1][j]
- 匹配 0 个字符
那么最后, dp[i][j] 就是最后的答案。
因为自己代码写的太垃圾了了,就贴一个官方的代码吧
class Solution {public:bool isMatch(string s, string p) {int m = s.size();int n = p.size();vector<vector<int>> dp(m + 1, vector<int>(n + 1));dp[0][0] = true;for (int i = 1; i <= n; ++i) {if (p[i - 1] == '*') {dp[0][i] = true;}else {break;}}for (int i = 1; i <= m; ++i) {for (int j = 1; j <= n; ++j) {if (p[j - 1] == '*') {dp[i][j] = dp[i][j - 1] | dp[i - 1][j];}else if (p[j - 1] == '?' || s[i - 1] == p[j - 1]) {dp[i][j] = dp[i - 1][j - 1];}}}return dp[m][n];}};作者:LeetCode-Solution链接:https://leetcode-cn.com/problems/wildcard-matching/solution/tong-pei-fu-pi-pei-by-leetcode-solution/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
