From 8c0dd58bed8f6e00028e55ee748fde724842c04e Mon Sep 17 00:00:00 2001 From: ember <1279347317@qq.com> Date: Tue, 2 Sep 2025 00:39:40 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E6=96=87=E7=AB=A0=E5=86=85?= =?UTF-8?q?=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/post/算法题/子序列dp.md | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/content/post/算法题/子序列dp.md b/content/post/算法题/子序列dp.md index d48c433..0d293cd 100644 --- a/content/post/算法题/子序列dp.md +++ b/content/post/算法题/子序列dp.md @@ -2,7 +2,7 @@ title: 两字符串系列DP问题归纳 description: 两字符串二维DP系列问题 date: 2025-08-31T21:50:00+08:00 -lastmod: 2025-08-31T21:51:00+08:00 +lastmod: 2025-09-02T00:39:00+08:00 slug: 子序列dp # image: helena-hertz-wWZzXlDpMog-unsplash.jpg categories: @@ -156,3 +156,26 @@ $dp[0][j] = 0$,$dp[i][0] = 0$。 - `dp[i][0] = (dp[i-1][0] && s1[i-1] == s3[i-1]) `,1 <= i <= m。 - `dp[0][j] = (dp[0][j-1] && s2[j-1] == s3[j-1]) `,1 <= j <= n。 - 必须检查:如果`s1.size() + s2.size() != s3.size()`,则直接`return false`。 + +# 通配符匹配 + +给你一个输入字符串 (`s`) 和一个字符模式 (`p`) ,请你实现一个支持 `'?'` 和 `'*'` 匹配规则的通配符匹配: + +- `'?'` 可以匹配任何单个字符。 +- `'*'` 可以匹配任意字符序列(包括空字符序列)。 + +判定匹配成功的充要条件是:字符模式必须能够 **完全匹配** 输入字符串(而不是部分匹配)。 + +## DP公式 + +`dp[i][j]`代表的是`s[0..i-1]`和`p[0..j-1]`能否匹配(`bool`类型)。 + +- 如果 $p[j-1] = '?'$ 或者 $p[j-1] = s[i-1]$,则 $dp[i][j] = dp[i-1][j-1]$。 +- 如果 $p[j-1] = '*'$,则 $dp[i][j] = dp[i-1][j]\ ||\ dp[i][j-1]$。 +- 其他情况下,$dp[i][j] = false$。 + +## 边界条件 + +- `dp[0][0] = true`,表示空字符串可以匹配空字符串。 +- `dp[i][0] = false`,1 <= i <= m,表示在非空字符串中匹配空字符串,显然不可能。 +- `dp[0][j]`为`true`当且仅当`p[0..j-1]`中全是`'*'`,1 <= j <= n。 \ No newline at end of file