力扣困难题10. 正则表达式匹配

87 阅读1分钟

这个题是给我们一个正则匹配规则让我们看看是否可以匹配成功

  • '.' 匹配任意单个字符
  • '*' 匹配零个或多个前面的那一个元素

这道题可以使用动态规划去做,f[i][j]表示字符串前i个是否可以与前j个匹配成功,由此我们可以分为两种情况匹配规则第j个元素是否是*根据这个去划分情况然后根据不同情况得到最后答案

image.png 当第j个元素是*的时候下面是转移方程的推导过程,主要是看这个*匹配到底是匹配多少个,通过下面的运算可以发现可以使用f[i - 1][j]去表示f[i][j]

image.png

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