这个题是给我们一个正则匹配规则让我们看看是否可以匹配成功
'.'匹配任意单个字符'*'匹配零个或多个前面的那一个元素
这道题可以使用动态规划去做,f[i][j]表示字符串前i个是否可以与前j个匹配成功,由此我们可以分为两种情况匹配规则第j个元素是否是*根据这个去划分情况然后根据不同情况得到最后答案
当第j个元素是
*的时候下面是转移方程的推导过程,主要是看这个*匹配到底是匹配多少个,通过下面的运算可以发现可以使用f[i - 1][j]去表示f[i][j]
func isMatch(s string, p string) bool {
n, m := len(s), len(p)
s = " " + s
p = " " + p
f := make([][]bool, n + 1)
for i := 0; i <= n; i ++ {
f[i] = make([]bool, m + 1)
}
f[0][0] = true
for i := 0; i <= n; i ++ {
for j := 1; j <= m; j ++ {
if i > 0 && p[j] != '*'{
f[i][j] = f[i - 1][j - 1] && (s[i] == p[j] || p[j] == '.')
} else if p[j] == '*'{
f[i][j] = f[i][j - 2] || i > 0 && f[i - 1][j] && (s[i] == p[j - 1] || p[j - 1] == '.')
}
}
}
return f[n][m]
}