10. Regular Expression Matching

Given an input string (s) and a pattern (p), implement regular expression matching with support for '.' and '*'.

'.' Matches any single character.
'*' Matches zero or more of the preceding element.

The matching should cover the entire input string (not partial).

Note:

  • s could be empty and contains only lowercase letters a-z.
  • p could be empty and contains only lowercase letters a-z, and characters like . or *.

Example 1:

Input:
s = "aa"
p = "a"
Output: false
Explanation: "a" does not match the entire string "aa".

Example 2:

Input:
s = "aa"
p = "a*"
Output: true
Explanation: '*' means zero or more of the preceding element, 'a'. Therefore, by repeating 'a' once, it becomes "aa".

Example 3:

Input:
s = "ab"
p = ".*"
Output: true
Explanation: ".*" means "zero or more (*) of any character (.)".

Example 4:

Input:
s = "aab"
p = "c*a*b"
Output: true
Explanation: c can be repeated 0 times, a can be repeated 1 time. Therefore, it matches "aab".

Example 5:

Input:
s = "mississippi"
p = "mis*is*p*."
Output: false
class Solution {
public:
    bool isMatch(string s, string p) {
        int m = s.size();
        int n = p.size();

        vector<vector<bool>> dp(m + 1, vector<bool>(n + 1, false));
        //1.dp[0][0] = true;
        dp[0][0] = true;
        //2.dp[i][0] = false // 初始化时已经设置
        //3.dp[0][j] = ? 只有 #*#*#* 或者 (#*)* 这种模式才能匹配空字符串
        for(int j = 0; j < n; j++)
        {
            if ((p[j] == '*') && (dp[0][j-1]))
                dp[0][j + 1] = true;
        }
        // 1. s[i] == p[j] || p[j] == '.' : dp[i][j] = dp[i - 1][j - 1]
        // 2. p[j] == '*':
        //      (1). s[i] != p[j - 1]:dp[i][j] = dp[i][j - 2] 
        //      (2). s[i] == p[j - 1] || p[j - 1] == '.': dp[i][j] = dp[i][j - 2] || dp[i][j - 1] || dp[i - 1][j]
        //       其中,dp[i][j - 2]为#*匹配0个, dp[i][j - 1]为#*匹配1个,dp[i - 1][j]为#*匹配多个
        for (int i = 0; i < m; ++i)
        {
            for (int j = 0; j < n; ++j)
            {
                if(p[j] == '.'){
                    dp[i+1][j+1] = dp[i][j];
                }
                if(s[i] == p[j]){
                    dp[i+1][j+1] = dp[i][j];
                }
                if (p[j] == '*')
                {
                    if ((s[i] != p[j-1]) && (p[j - 1] != '.')){
                        dp[i+1][j+1] = dp[i+1][j-1];
                    }
                    else{
                        dp[i+1][j+1] = (dp[i+1][j] || dp[i][j+1] || dp[i+1][j-1]);
                    }
                }
            }
        }
        return dp[m][n];
    }
};
原文地址:https://www.cnblogs.com/qiang-wei/p/12284181.html