fix typo & highlight

This commit is contained in:
ShusenTang 2020-06-19 09:14:08 +08:00 committed by GitHub
parent ae45e708f5
commit a329eed756
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -37,13 +37,13 @@
``` ```
dp[i][j] = true 表示 s[0,1,..,i-1]和p[0,1,..,j-1]]能匹配上 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]`; 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]`。 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空间复杂度可优化至线性。 时间复杂度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。 为此我们用jStar来表示p串中星号的位置还有用iStar表示星号匹配到s串中的最后位置iStar和jStar均初始化为 -1表示还没遇到星号。另外设置两个工作指针i和j分别指向s和p的当前字符初始均为0。