通配符匹配
原题在这里:
copy题目:
给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?' 和 '*' 的通配符匹配。
'?' 可以匹配任何单个字符。
'*' 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。
1.常规记忆化搜索+特定剪枝
analyse:
当前为x,y
后续分别有 u=n-x-1,v=m-y-1个字符要匹配
b串后续有z个*
如果u>=v-z
*可以进行匹配
如果u< v-z
*不能进行匹配
也即只能dfs(i,y+1)
code:
class Solution { vector<bool> vis; vector<int> num; string a, b; int n, m; void dfs(int x, int y) //当前匹配x,y { if (vis[x * m + y]) return; vis[x * m + y] = true; if (b[y] == '*') { for (int i = x; i <= n; ++i) { dfs(i, y + 1); if (n - i + 1 < m - y - num[y]) break; } } if (x >= n || y >= m) return; if (a[x] == b[y] || b[y] == '?') dfs(x + 1, y + 1); } public: bool isMatch(string s, string p) { if (s == p) return true; if (p == "") return false; a = s, b = p; n = s.length(), m = p.length(); num = vector<int>(m + 1, 0); vis = vector<bool>(n * m + m + 1, false); for (int i = m - 1; i >= 0; --i) num[i] = num[i + 1] + (p[i] == '*'); dfs(0, 0); return vis[n * m + m]; } };
【Over】

浙公网安备 33010602011771号