44. 通配符匹配
解析:
dp看终态,dp[n][m]可以通过dp[n - 1][m]、dp[n][m - 1]、dp[n - 1][m - 1]转移
接下来看什么条件下会转移
当m = '*'时,
dp[i][j] = (dp[i - 1][j] || dp[i][j - 1] || dp[i - 1][j - 1]);
当m != ‘*’时
说明s[n]必定要与p[m]进行匹配
if (s[i] == p[j] || p[j] == '?') dp[i][j] = dp[i - 1][j - 1]
否则就是false
状态转移方程还是很好推的,主要是初态
直接看代码吧
class Solution { public: bool isMatch(string s, string p) { bool dp[2010][2010]; int n = s.size(), m = p.size(); if (n == 0 && m == 0) return true; else if (n == 0) { int k = 0; for(; k < m && p[k] == '*'; k++); if (k == m) return true; return false; } else if (m == 0) return false; if (s[0] == p[0] || p[0] == '?' || p[0] == '*') dp[0][0] = true; else dp[0][0] = false; for (int i = 1; i < n; i++) { dp[i][0] = (dp[i - 1][0] && p[0] == '*'); } bool p_star_flag = true; if (p[0] != '*') p_star_flag = false; for (int j = 1; j < m; j++) { dp[0][j] = (dp[0][j - 1] && (p[j] == '*' || (s[0] == p[j] || p[j] == '?') && p_star_flag)); if (p[j] != '*') p_star_flag = false; } for (int i = 1; i < n; i++) { for (int j = 1; j < m; j++) { if (p[j] == '*') { dp[i][j] = (dp[i - 1][j] || dp[i][j - 1] || dp[i - 1][j - 1]); } else { if (s[i] == p[j] || p[j] == '?') dp[i][j] = dp[i - 1][j - 1]; else dp[i][j] = false; } } } return dp[n - 1][m - 1]; } };
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。

浙公网安备 33010602011771号