题意理解
给定文本串 SSS 和模式串 PPP,其中 ? 匹配任意单个字符,* 匹配任意字符序列(包括空串)。判断 PPP 能否完全匹配 SSS。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
思路分析
使用动态规划。
设 dp[i][j]dp[i][j]dp[i][j] 表示:SSS 的前 iii 个字符和 PPP 的前 jjj 个字符是否匹配。
状态转移:
1. 若 P[j−1]P[j-1]P[j−1] 是普通字符:
dp[i][j]=dp[i−1][j−1]∧(S[i−1]=P[j−1])dp[i][j] = dp[i-1][j-1] \land (S[i-1] = P[j-1]) dp[i][j]=dp[i−1][j−1]∧(S[i−1]=P[j−1])
2. 若 P[j−1]P[j-1]P[j−1] 是 ?(匹配任意单个字符):
dp[i][j]=dp[i−1][j−1]dp[i][j] = dp[i-1][j-1] dp[i][j]=dp[i−1][j−1]
3. 若 P[j−1]P[j-1]P[j−1] 是 *(匹配任意序列):
dp[i][j]=dp[i][j−1]∨dp[i−1][j]dp[i][j] = dp[i][j-1] \lor dp[i-1][j] dp[i][j]=dp[i][j−1]∨dp[i−1][j]
* dp[i][j−1]dp[i][j-1]dp[i][j−1]:* 匹配空串
* dp[i−1][j]dp[i-1][j]dp[i−1][j]:* 匹配至少一个字符
边界条件:
* dp[0][0]=truedp[0][0] = truedp[0][0]=true:空串匹配空模式
* dp[0][j]=truedp[0][j] = truedp[0][j]=true 当且仅当 PPP 的前 jjj 个字符全是 *
答案: dp[n][m]dp[n][m]dp[n][m]
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
参考代码