LeetCode——正则表达式匹配

Posted CCxiao5

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode——正则表达式匹配相关的知识,希望对你有一定的参考价值。

题目地址:https://leetcode-cn.com/problems/regular-expression-matching/

解题思路:首先很明显字符串的匹配适合动态规划,所以建立dp[i][j]表示s的前i个字符与p中的前j个字符是否能够匹配。然后就是判断各种情况。笔者在写的时候情况考虑不全导致没有通过。

"aab"
"c*a*b"

"aa"
"a*"

""
"."

所有情况的归纳:

如果 p.charAt(j) == s.charAt(i) : dp[i][j] = dp[i-1][j-1];
如果 p.charAt(j) == ‘.‘ : dp[i][j] = dp[i-1][j-1];
如果 p.charAt(j) == ‘*‘:
  如果 p.charAt(j-1) != s.charAt(i) : dp[i][j] = dp[i][j-2] //in this case, a* only counts as empty
  如果 p.charAt(i-1) == s.charAt(i) or p.charAt(i-1) == ‘.‘:
    dp[i][j] = dp[i-1][j] //in this case, a* counts as multiple a
    or dp[i][j] = dp[i][j-1] // in this case, a* counts as single a
    or dp[i][j] = dp[i][j-2] // in this case, a* counts as empty

class Solution {
public:
    bool isMatch(string s, string p) {
        int m = s.size();
        int n = p.size();
        int i, j;
        //dp[i][j]:表示s的前i个字符与p中的前j个字符是否能够匹配。
        vector<vector<bool>> dp(m + 1, vector<bool>(n + 1));
        dp[0][0] = true;
        //设置边界,避免越界
        for (i = 1; i <= m; i++)
            dp[i][0] = false;
        for (j = 1; j <= n; j++)
            if (p[j - 1] == *)
                dp[0][j] = dp[0][j - 1] || dp[0][j - 2];
            else
                dp[0][j] = false;

        //正常判断
        for (i = 1; i <= m; i++)
            for (j = 1; j <= n; j++) {
                if (j == 1)
                    if (i == 1)
                        dp[1][1] = s[0] == p[0] || p[0] == .;
                    else
                        dp[i][j] = false;
                else {
                    if (p[j-1] == *) {
                        if (p[j - 2] != s[i-1] && p[j - 2] != .)
                            dp[i][j] = dp[i][j - 2];//如果最后一个字符不相等,则把*前的一个字符删去:aa与aab*;aabc与aab*
                        else if (p[j - 2] == s[i-1] || p[j - 2] == .)
                            dp[i][j] = dp[i - 1][j] || dp[i][j - 1] || dp[i][j - 2];//分别是匹配多个,匹配一个,匹配0个
                    }
                    else if (p[j-1] == .)
                        dp[i][j] = dp[i - 1][j - 1];//如果是‘.‘,直接判断两个字符串前i-1,j-1是否匹配。
                    else
                        dp[i][j] = s[i-1] == p[j-1] && dp[i - 1][j - 1];
                }
            }
        return  dp[m][n];
    }
};

 

以上是关于LeetCode——正则表达式匹配的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode(算法)- 10. 正则表达式匹配

循环通过 python 正则表达式匹配

LeetCode-010-正则表达式匹配

LeetCode(剑指 Offer)- 19. 正则表达式匹配

leetcode19 正则表达式匹配(Hard)

LeetCode-递归正则表达式匹配