通配符匹配

原题在这里

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];
    }
};
normal

 

【Over】

posted @ 2022-04-04 15:14  Renhr  阅读(39)  评论(0)    收藏  举报