44. 通配符匹配

DP的思路:

  1. 通常dp第一个难点都是找状态转移方程,对于 s中前i个字符与p中前j个字符:

    1)p[j] == s[i] && dp[i-1][j-1]   =>  dp[i][j] = True

    2)   p[j]  == '?'  && dp[i-1][j-1]  =>  dp[i][j] = True

    3)   p[j] == '*'   

      (1) 选择不使用*,则dp[i][j] = dp[i][j-1]

      (2) 选择使用*,则dp[i][j]  = dp[i-1][j]  

      (3)综合起来  dp[i][j] = dp[i][j-1] or dp[i-1][j]  

    4) 对于 ‘3)’中的情况,其实很难理解,这里需要过一下s,j的双重循环,理解怎么在遍历

      (1) 首先对于s[0]遍历p中每一个字符,看能否匹配,如果s[0]是‘*’,则能完全匹配p,则dp[0][0-j-1]都是True

      (2) 再看s[1],看能匹配到哪里,然后s[2].....

      (3) 所以 3.1中不使用‘*’的意思是,看s[i]在j=0~j=len(p)-1的过程中,能不能匹配s[i][j-1]

      (4) 3.2中使用的意思是,对于上一个s字符s[i-1]是否已经匹配过p[j]

      (5) 综上,弄清楚dp的遍历顺序对于理解  p[j] == '*'  的情况很重要

  2. dp中的第二个难点是dp初始化

    1)本题是顺序遍历,需要用到 dp[i-1][j-1] dp[i-1][j] dp[i][j-1] ,所以初始化时需要在前面预留一行一列

    2)dp[0][0] = True 

    3)  对于dp[0][j],如果p一直是‘*’,则可一直匹配空串

 

 

 

 

 

posted @ 2020-09-26 12:53  ChevisZhang  阅读(150)  评论(0编辑  收藏  举报