正则表达式匹配模拟

原题在这里

题意:给定原串和匹配串,'.'表示任意字符,'*'表示零或多个前置字符,问是否匹配。

最开始是考虑的双指针有多少种移动情况,想通过去重之类的操作简化字符处理,然后发现不太行,

于是从逻辑角度选择了dfs处理。

头天晚上做的时候疯狂wa,写了1h左右没写出来,归根于我还是空想法解题,没有打草稿写出细节,甚至i,j下标都混淆了。。。

还有很重要的一点就是,没有从每一种状态进行深度考虑,考虑当前状态能有何种去向,想当然式的if+return犯错,实际是if+return(dfs)||(dfs)之类的。

后知后觉,然后今天认真理清楚后,只是越界的时候少了一种状态没处理好,re一次,过了。

另外就是剪枝了,有hash+map/set/vector,运行效果速度是未剪枝的百倍以上。

class Solution
{
    string x, y;
    int lx, ly;
    vector<vector<bool>> pd;
    bool dfs(int i, int j)
    {
        if (i == lx && j == ly)
            return true; //两者为最后则true,否则不是
        //越界
        if (j >= ly || i > lx || pd[i][j]) // i==lx时候,j可以通过*单独移动
            return false;
        pd[i][j] = true;
        if (x[i] == y[j] || y[j] == '.')
            return dfs(i + 1, j + 1) || (y[j + 1] == '*' && dfs(i, j + 2)); //匹配或者不匹配
        else if (y[j] == '*')
            return dfs(i, j - 1) || dfs(i, j + 1); //向前和向后移动
        else if (y[j + 1] == '*')
            return dfs(i, j + 2); //无法匹配且后置*
        else
            return false;
    }

public:
    bool isMatch(string s, string p)
    {
        x = s + ' ', y = p + ' ';//越界优化处理
        lx = s.length(), ly = p.length();
        pd = vector<vector<bool>>(lx + 1, vector<bool>(ly + 1, false));//剪枝
        return dfs(0, 0);
    }
};
dfs最终代码

还有一个版本是dp,暂时搁置一下。

posted @ 2022-03-06 18:48  Renhr  阅读(61)  评论(0)    收藏  举报