LeetCode——10.正则表达式匹配(困难)DP
Posted nirvana · rebirth
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode——10.正则表达式匹配(困难)DP相关的知识,希望对你有一定的参考价值。
题解
- 定义 d p [ i ] [ j ] : s [ 0 , i − 1 ] 和 p [ 0 , j − 1 ] 是 否 匹 配 dp[i][j]:s[0,i-1]和p[0,j-1]是否匹配 dp[i][j]:s[0,i−1]和p[0,j−1]是否匹配
- 初值 d p [ 0 ] [ 0 ] = t r u e dp[0][0]=true dp[0][0]=true
- 只需要注意 ∗ * ∗的判断
- 不匹配的时候 d p [ i ] [ j ] = d p [ i ] [ j − 2 ] dp[i][j]=dp[i][j-2] dp[i][j]=dp[i][j−2],把 ∗ * ∗和 ∗ * ∗之前的字符拿掉,看是否匹配
- 匹配的时候,由于可能匹配很多个,然而我们不需要确定到底匹配了几次,只需要判断
- s [ 0 , i − 2 ] 和 p [ 0 , j − 1 ] 是 否 匹 配 s[0,i-2]和p[0,j-1]是否匹配 s[0,i−2]和p[0,j−1]是否匹配,也就是当前 s s s最末尾已经知道能和 p [ j − 2 ] p[j-2] p[j−2]匹配了,那么删掉 s 最 末 尾 s最末尾 s最末尾 的元素,看看是否匹配即可。
- 还有,两层循环次序无所谓
AC-Code
class Solution
public:
bool isMatch(string s, string p)
int n = s.length();
int m = p.length();
auto matches = [&](int i, int j)
if(i == 0) return false;
if(p[j - 1] == '.') return true;
return s[i - 1] == p[j - 1];
;
vector<vector<int>> dp(n + 1, vector<int>(m + 1));
dp[0][0] = true;
for(int j = 1; j <= m; ++j)
for(int i = 0; i <= n; ++i)
if(p[j - 1] == '*')
dp[i][j] |= dp[i][j - 2]; // .* 不匹配
if(matches(i, j - 1)) // 可以匹配(可能多次)
dp[i][j] |= dp[i - 1][j]; // 把当前s[i-1]删掉,看剩下的是否能匹配
else
if(matches(i, j))
dp[i][j] |= dp[i - 1][j - 1];
return dp[n][m];
;
以上是关于LeetCode——10.正则表达式匹配(困难)DP的主要内容,如果未能解决你的问题,请参考以下文章