Leetcode题解 剑指 Offer 19. 正则表达式匹配
PROBLEM
难度 困难
MY ANSWER
写一晚上没写出来。
BETTER SOLUTION
动态规划
用dp[i][j]
表示s的前i个字符和p的前j个字符是否能匹配,由于 dp[0][0]
代表的是空字符的状态, 因此 dp[i][j]
对应的添加字符是 s[i - 1]
和 p[j - 1]
。时间复杂度O(mn),空间复杂度O(mn)。
- 当
p[j - 1] = '*'
时,dp[i][j]
在当以下任一情况为 true 时等于 true :dp[i][j - 2]
: 即将字符组合p[j - 2] *
看作出现 0 次时,能否匹配;dp[i - 1][j]
且s[i - 1] = p[j - 2]
: 即让字符p[j - 2]
多出现 1 次时,能否匹配;dp[i - 1][j]
且p[j - 2] = '.'
: 即让字符'.'
多出现 1 次时,能否匹配;
- 当
p[j - 1] != '*'
时,dp[i][j]
在当以下任一情况为 true时等于 true:dp[i - 1][j - 1]
且s[i - 1] = p[j - 1]
: 即让字符p[j - 1]
多出现一次时,能否匹配;dp[i - 1][j - 1]
且p[j - 1] = '.'
: 即将字符.
看作字符s[i - 1]
时,能否匹配;
- 初始化: 需要先初始化
dp
矩阵首行,以避免状态转移时索引越界。dp[0][0] = true
- **
dp[0][j] = dp[0][j - 2]
且p[j - 1] = '*'
**:首行 s 为空字符串,因此当 p 的偶数位为 * 时才能够匹配(即让 p 的奇数位出现 0 次,保持 p 是空字符串)。因此,循环遍历字符串 p ,步长为 2(即只看偶数位)。
class Solution { |
SUMMARY
动态规划最主要的是分析得出状态转移方程。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Jayce's Blog!
评论