正则表达式匹配模拟
原题在这里。
题意:给定原串和匹配串,'.'表示任意字符,'*'表示零或多个前置字符,问是否匹配。
最开始是考虑的双指针有多少种移动情况,想通过去重之类的操作简化字符处理,然后发现不太行,
于是从逻辑角度选择了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); } };
还有一个版本是dp,暂时搁置一下。

浙公网安备 33010602011771号