10. 正则表达式匹配
1 // 1、当s[i] == p[j]时,dp[i][j] = dp[i - 1][j - 1] 2 // 2、当p[j] == '.'时,dp[i][j] = dp[i - 1][j - 1] 3 // 3、当p[j] == '*'时, 4 // 3.1、当s[i] != p[j - 1]时,dp[i][j] = dp[i][j - 2] 5 // 3.2、当s[i] == p[j - 1] || p[j - 1] == '.'时, 6 // 3.2.1、匹配0个. dp[i][j] = dp[i][j - 2] 7 // 3.2.2、匹配1个. dp[i][j] = dp[i - 1][j - 2] 8 // 3.2.3、匹配多个.dp[i][j] = dp[i - 1][j] 9 class Solution 10 { 11 public: 12 bool isMatch(string s, string p) 13 { 14 int m = s.size(), n = p.size(); 15 vector<vector<bool>> dp(m + 1,vector<bool>(n + 1,false)); 16 // s和p都是空串的时候自然true 17 dp[0][0] = true; 18 19 // 初始化首列 20 for(int i = 1; i <= m; i++) dp[i][0] = false; 21 22 // 初始化首行 23 for(int j = 1; j <= n; j++) 24 { 25 if(j != 1 && p[j - 1] == '*') dp[0][j] = dp[0][j - 2]; 26 } 27 28 // 通过递推公式开始填充矩阵 29 for(int i = 1; i <= m; i++) 30 { 31 for(int j = 1; j <= n; j++) 32 { 33 if(p[j - 1] != '*') 34 { 35 if(s[i - 1] == p[j - 1] || p[j - 1] == '.') dp[i][j] = dp[i - 1][j - 1]; 36 } 37 else 38 { 39 if(j > 1) 40 { 41 if(s[i - 1] == p[j - 2] || p[j - 2] == '.') 42 { 43 dp[i][j] = dp[i - 1][j] || dp[i][j - 2] || dp[i - 1][j - 2]; 44 } 45 else 46 { 47 dp[i][j] = dp[i][j - 2]; 48 } 49 } 50 } 51 } 52 } 53 return dp[m][n]; 54 } 55 };
Mamba never out

浙公网安备 33010602011771号