44. 通配符匹配

Facebook 考过 经典の难!
给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 '?''*' 的通配符匹配。
‘?’ 可以匹配任何单个字符。
‘*’ 可以匹配任意字符串(包括空字符串)。

两个字符串完全匹配才算匹配成功。
输入:
s = “adceb”
p = “ab”
输出: true
解释: 第一个 ‘‘ 可以匹配空字符串, 第二个 ‘‘ 可以匹配字符串 “dce”.

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

image.png