10.regular-expression-matching.go 711 B

123456789101112131415161718192021222324
  1. func isMatch(s string, p string) bool {
  2. m, n := len(s), len(p)
  3. dp := make([][]bool, m+1)
  4. for i := range dp {
  5. dp[i] = make([]bool, n+1)
  6. }
  7. dp[0][0] = true
  8. // dp[i][0] = false, if i > 0
  9. for i := 1; i <= n; i++ {
  10. dp[0][i] = 1 < i && p[i-1] == '*' && dp[0][i-2]
  11. }
  12. // dp[i][j] = if p[j-1] == '*', dp[i][j-2] || ((p[j-2] == '.' || s[i-1] == p[j-2]) && dp[i-1][j])
  13. // else, (p[j-2] == '.' || s[i-1] == p[j-1]) && dp[i-1][j-1]
  14. for i := 1; i <= m; i++ {
  15. for j := 1; j <= n; j++ {
  16. if p[j-1] == '*' {
  17. dp[i][j] = dp[i][j-2] || ((p[j-2] == '.' || s[i-1] == p[j-2]) && dp[i-1][j])
  18. } else {
  19. dp[i][j] = (p[j-1] == '.' || s[i-1] == p[j-1]) && dp[i-1][j-1]
  20. }
  21. }
  22. }
  23. return dp[m][n]
  24. }