题解 | #正则表达式匹配#
正则表达式匹配
https://www.nowcoder.com/practice/28970c15befb4ff3a264189087b99ad4
膜拜大佬题解
https://www.bilibili.com/video/BV1CK411c7gx?p=16
过程分析
str
的长度是m
,pattern
的长度是n
F(i,j)
的含义表示:str
的前i
位str[0,i-1]
pattern
的前j
位pattern[0,j-1]
是匹配的- 情况:
p[j-1] = .
或者p[j-1]= x
,x
表示任意一个小写字母,假如x=a
。此时只要S[i-1]=a
或者p[j-1]=.
就可以转换成子问题
- 如果
S[i-1] != a
直接返回false
- 如果
p[j-1] = *
,则需要考虑到p[j-2]
- 如果
S[i-1] == p[j-2],或者 p[j-2] == .
则需要匹配
- 初始化问题
s
为空,p
为空,返回true
,则dp[0][0] = true
s
不空,p
为空,均为false
,则dp[i][0] = false
p
不空,则需要计算
代码
#include <vector> class Solution { public: bool match(string str, string pattern) { int m = str.length(); int n = pattern.length(); vector<vector<bool>> dp(m + 1, vector<bool>(n + 1, false)); dp[0][0] = true; for (int i = 2; i <= n; ++i) { if (pattern[i-1] == '*') { dp[0][i] = dp[0][i-2]; } } for (int i = 1; i <= m; ++i) { for (int j = 1; j <= n; ++j) { if (pattern[j-1] != '*' && (pattern[j-1] == '.' || pattern[j-1] == str[i-1])) { dp[i][j] = dp[i-1][j-1]; } else if (j >= 2 && pattern[j-1] == '*') { if (pattern[j-2] == '.' || pattern[j-2] == str[i-1]) { dp[i][j] = dp[i-1][j] || dp[i][j-2]; } else { dp[i][j] = dp[i][j-2]; } } } } return dp[m][n]; } };
2023-剑指-DP 文章被收录于专栏
2023-剑指-DP