力扣 题目10-正则表达式匹配 下--这题有点难

题目


题解


 

没做出来呜呜呜只能看别人写的题解了 题解看这里

参考题解
作者:zhang-jian-qi-shi
链接:https://leetcode-cn.com/problems/regular-expression-matching/solution/c-dong-tai-gui-hua-by-zhang-jian-qi-shi-rzyp/
来源:力扣(LeetCode)

好在经过上一篇之后 这篇题解也能很快的看懂了

这里我再解析一点 能够看的更懂(反正是给我自己看 如果有大佬看到有什么不对的地方还是请谅解小白)

当p[j-1]=='*',
可以不匹配
dp[i][j]=dp[i][j-2]
拿个例子来说
abc
a*bc
这里的*就是不匹配 因为有0个匹配项 所以直接忽略这个* 以此j要j-2拿到*之前的那个字符a
因此dp[1][2]=dp[1][0]

可以匹配多次
当匹配为 1 个:dp[i][j]=dp[i-1][j-2] && (s[i-1] == p[j - 2] || p[j - 2] == '.')
拿个例子来说
aabc
a*bc
首先你要确保之前的匹配成功即dp[i-1][j-2]
然后s[i-1] == p[j - 2]->j - 2 *前面的那个字符 和现在s的i-1字符比较
.就是可以任意匹配
aaabc
a*bc
当匹配为 2 个:dp[i][j]=dp[i-2][j-2] && (s[i-2] == p[j - 2] &&s[i-1] == p[j - 2] || p[j - 2] == '.')
首先你要确保之前*之前的匹配成功即dp[i-2][j-2] 因为此时i又增加了1所以这次减2
然后s[i-2] == p[j - 2] &&s[i-1] == p[j - 2] 即*前面的那个字符 和现在s的i-1和i-2 两个字符比较(因为匹配为 2 个)
.就是可以任意匹配

然后就可以推第三个 第四个...
所以第i个就是
dp[i][j]=dp[i][j-2]||(dp[i-1][j-2] && (s[i-1] == p[j - 2] || p[j - 2] == '.'))||(dp[i-2][j-2] && (s[i-2] == p[j - 2] &&s[i-1] == p[j - 2] || p[j - 2] == '.'))||...
然后i-1个是
dp[i-1][j]=dp[i-1][j-2]||(dp[i-2][j-2] && (s[i-2] == p[j - 2] || p[j - 2] == '.'))||(dp[i-3][j-2] && (s[i-3] == p[j - 2] &&s[i-2] == p[j - 2] || p[j - 2] == '.'))||...
直接把i-1的代入i的
dp[i][j]=dp[i][j-2]||dp[i-1][j]&&(s[i-1]==p[j-2]||p[j-2]=='.')
这样结果就出来了
要注意
s一个字符都不选,此时要考虑p包含*的情况,因为*可以不匹配。
for(int i=2;i<=n;i++){
if(p[i-1]=='*')
dp[0][i]=dp[0][i-2];
}

代码

作者:zhang-jian-qi-shi
链接:https://leetcode-cn.com/problems/regular-expression-matching/solution/c-dong-tai-gui-hua-by-zhang-jian-qi-shi-rzyp/
来源:力扣(LeetCode)
#include<iostream>
#include<string>
#include <vector>
using namespace std;
class Solution {
public:
    bool isMatch(string s, string p) {
        int m = s.size(), n = p.size();
        vector<vector<int>> dp(m + 1, vector<int>(n + 1, false));//类似于二维数组
        dp[0][0] = true;
        for (int i = 2; i <= n; i++) {
            if (p[i - 1] == '*')
                dp[0][i] = dp[0][i - 2];
        }
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (p[j - 1] == '*') {
                    dp[i][j] = dp[i][j - 2] || (dp[i - 1][j] && (s[i - 1] == p[j - 2] || p[j - 2] == '.'));
                }
                else {
                    dp[i][j] = dp[i - 1][j - 1] && (s[i - 1] == p[j - 1] || p[j - 1] == '.');
                }
            }
        }
        return dp[m][n];
    }
};

int main() {
    Solution sol;
    bool zheng=sol.isMatch("aaa","a*");
    cout << zheng << endl;

}

 


 

posted @ 2022-03-27 13:30  无聊的阿库娅  阅读(24)  评论(0编辑  收藏  举报