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,i1]p[0,j1]
  • 初值 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][j2],把 ∗ * ∗ * 之前的字符拿掉,看是否匹配
  • 匹配的时候,由于可能匹配很多个,然而我们不需要确定到底匹配了几次,只需要判断
    • s [ 0 , i − 2 ] 和 p [ 0 , j − 1 ] 是 否 匹 配 s[0,i-2]和p[0,j-1]是否匹配 s[0,i2]p[0,j1],也就是当前 s s s最末尾已经知道能和 p [ j − 2 ] p[j-2] p[j2]匹配了,那么删掉 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的主要内容,如果未能解决你的问题,请参考以下文章

leetcode困难10正则表达式匹配

LeetCode——10.正则表达式匹配(困难)DP

LeetCode——10.正则表达式匹配(困难)DP

⭐算法入门⭐《动态规划 - 串匹配》困难01 —— LeetCode 10. 正则表达式匹配

leetcode 正则表达式匹配 困难

LeetCode 10. 正则表达式匹配