给定一个字符串 (s) 和一个字符模式 (p) ,实现一个支持 ‘?’ 和 ‘‘ 的通配符匹配。
#
# ‘?’ 可以匹配任何单个字符。
# ‘
‘ 可以匹配任意字符串(包括空字符串)。
#
#
# 两个字符串完全匹配才算匹配成功。
#
# 说明:
#
#
# s 可能为空,且只包含从 a-z 的小写字母。
# p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和
#
#
# 示例 1:
#
# 输入:
# s = “aa”
# p = “a”
# 输出: false
# 解释: “a” 无法匹配 “aa” 整个字符串。
#
# 示例 2:
#
# 输入:
# s = “aa”
# p = “

# 输出: true
# 解释: ‘‘ 可以匹配任意字符串。
#
#
# 示例 3:
#
# 输入:
# s = “cb”
# p = “?a”
# 输出: false
# 解释: ‘?’ 可以匹配 ‘c’, 但第二个 ‘a’ 无法匹配 ‘b’。
#
#
# 示例 4:
#
# 输入:
# s = “adceb”
# p = “
ab”
# 输出: true
# 解释: 第一个 ‘
‘ 可以匹配空字符串, 第二个 ‘‘ 可以匹配字符串 “dce”.
#
#
# 示例 5:
#
# 输入:
# s = “acdcb”
# p = “a
c?b”
# 输出: false
# Related Topics 贪心 递归 字符串 动态规划
# 👍 873 👎 0

  1. class Solution:
  2. def isMatch(self, s: str, p: str) -> bool:
  3. zong = len(p) + 1 #纵轴长度
  4. heng = len(s) + 1 #横轴长度
  5. table = [[False] * heng for i in range(zong)]
  6. table[0][0] = True
  7. if p.startswith("*"):
  8. table[1] = [True]*heng
  9. for m in range(1,zong):
  10. path = False #是否可以在该行使用*的特技
  11. for n in range(1,heng):
  12. if p[m-1] == "*": #m是表格的索引,但不是p的索引
  13. if table[m-1][0] == True:
  14. table[m] = [True]*heng
  15. if table[m-1][n]: #只要顶上有了True,就可以开通*接下来的所有道路
  16. path = True
  17. if path:
  18. table[m][n] = True
  19. elif p[m-1] == "?" or p[m-1]==s[n-1]: #先判断字母是否符合
  20. table[m][n] = table[m-1][n-1] #再看左上方格子是不是T
  21. return table[zong-1][heng-1]