题目:实现简单正则匹配,除了小写字母就只有 "." 和 "*" 了。
题解: 我用的记忆化搜索,直接暴力搜索太蠢了,记录一下已经计算过得 s[i] 与 p[j] 的匹配情况,如果要用话看是否已经处理过了再决定要不要算就好了,为了省内存记忆化的数组动态开了= =
class Solution { public: int **dp; int n,m; bool dfs(int i, int j, const string& s, const string& p){ if (dp[i][j] != 0) return dp[i][j] == 1; bool ans = false; if (j == m){ ans = i == n; } else{ bool match = (i < n && (p[j] == s[i] || p[j] == '.')); if (j + 1 < m && p[j + 1] == '*'){ ans = (dfs(i, j + 2, s, p) || match && dfs(i + 1, j, s, p)); } else { ans = match && dfs(i + 1, j + 1, s, p); } } dp[i][j] = ans ? 1 : -1; return ans; } bool isMatch(string s, string p) { n = (int)s.size(),m = (int)p.size(); dp = new int*[n + 1]; for (int i = 0; i < n + 1; ++i){ dp[i] = new int[m + 1]; for (int j = 0; j < m + 1; ++j) dp[i][j] = 0; } bool res = dfs(0, 0, s, p); delete[] dp; return res; } };