From a329eed7564d6a5761018ddc4076a46fb97cc31a Mon Sep 17 00:00:00 2001 From: ShusenTang Date: Fri, 19 Jun 2020 09:14:08 +0800 Subject: [PATCH] fix typo & highlight --- solutions/44. Wildcard Matching.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/solutions/44. Wildcard Matching.md b/solutions/44. Wildcard Matching.md index ef83d64..198b76a 100644 --- a/solutions/44. Wildcard Matching.md +++ b/solutions/44. Wildcard Matching.md @@ -37,13 +37,13 @@ ``` dp[i][j] = true 表示 s[0,1,..,i-1]和p[0,1,..,j-1]]能匹配上 ``` -需要仔细考虑一下初始状态,首先我们知道两个空串是能匹配的,所以`dp[0][0]=true`,另外由于星号可匹配空串,所以如果`p[k] = '*'`,我们需要将`dp[0][k]初始化为``,...,k-1]`都是true。 +需要仔细考虑一下初始状态,首先我们知道两个空串是能匹配的,所以`dp[0][0]=true`,另外由于星号可匹配空串,所以如果`p[0...k-1] = '*'`,我们需要将`dp[0][1...k]`初始化为true。 接下来就是状态转移方程,根据是否是星号有两种情况: 1. `p[j-1] == '*'`,那么p[j-1]既可以匹配掉当前s的字符s[i-1]也可以选择不匹配(即匹配空字符),即`p[i][j] = dp[i - 1][j] || dp[i][j - 1]`; 2. 否则,就只能看p[j-1]和s[i-1]是否能够硬性匹配了,而且还有考虑前面的匹配情况,即`dp[i][j] = (s[i - 1] == p[j - 1] || p[j - 1] == '?') && dp[i - 1][j - 1]`。 -可见状态数组里的`dp[i][j]`只和其上(`dp[i - 1][j]`)、左上(`dp[i - 1][j - 1]`)、左(dp[i][j - 1])边的元素有关,所以我们可以考虑用滚动数组优化空间,以及剪枝(若上一行元素和当前行第一个元素dp[i][0]都为false的话直接返回false就可以了)。 +可见状态数组里的`dp[i][j]`只和其上(`dp[i - 1][j]`)、左上(`dp[i - 1][j - 1]`)、左(`dp[i][j - 1]`)边的元素有关,所以我们可以考虑用滚动数组优化空间,以及剪枝(若上一行元素和当前行第一个元素dp[i][0]都为false的话直接返回false就可以了)。 时间复杂度O(mn)(亲测96ms),空间复杂度可优化至线性。 @@ -51,7 +51,7 @@ dp[i][j] = true 表示 s[0,1,..,i-1]和p[0,1,..,j-1]]能匹配上 此题还有一个比较难想但是亲测最快的方法。 -基本的思路就是贪婪地一一匹配,如果在某处匹配失败了,那么回到最近的星号处,将本次该星号匹配的字符数加上1继续匹配,即若本次该星号匹配了k个字符,那么再多匹配一个字符匹配k+1个字符重新尝试匹配。 +基本的思路就是**贪婪**地一一匹配,**如果在某处匹配失败了,那么回到最近的星号处,将本次该星号匹配的字符数加上1继续匹配**,即若本次该星号匹配了k个字符,那么再多匹配一个字符匹配k+1个字符重新尝试匹配。 为此我们用jStar来表示p串中星号的位置,还有用iStar表示星号匹配到s串中的最后位置,iStar和jStar均初始化为 -1,表示还没遇到星号。另外设置两个工作指针i和j分别指向s和p的当前字符,初始均为0。 @@ -165,4 +165,4 @@ public: return j == n; } }; -``` \ No newline at end of file +```