> 文章列表 > 力扣:正则表达式匹配

力扣:正则表达式匹配

力扣:正则表达式匹配

原题链接
DP:
f[i][j]\\rm f[i][j]f[i][j]:表示长度 1−i\\rm 1-i1iS\\rm SS 串与长度 1−j\\rm1- j1jP\\rm PP 串是否匹配
①首先将 ∗* 字符与前面的字母看作一个整体。
p[j]≠∗\\rm p[j] \\ne *p[j]=:f[i][j]\\rm f[i][j]f[i][j]要想成立,则 S\\rm SS 串前 i−1\\rm i - 1i1 个字符与 P\\rm PP 串的前 j−1\\rm j-1j1 个字符匹配,同时满足 S\\rm SS 串第 i\\rm ii 个字符与 P\\rm PP 串第 j\\rm jj 个字符匹配或者,P\\rm PP 串第 j\\rm jj 个字符为 ′.′'.'.,即:
f[i][j]=f[i−1][j−1]&&(s[i]==p[j]∣∣p[j]==′.′)\\rm f[i][j] = f[i - 1][j-1] \\&\\&(s[i] == p[j] || p[j] == '.') f[i][j]=f[i1][j1]&&(s[i]==p[j]∣∣p[j]==.)
p[j]=∗\\rm p[j] =*p[j]=:
∗* 会匹配 S\\rm SS 串任意多个字符:
1)当 ∗* 匹配 S\\rm SS0 个字符时:由于将 ∗* 字符与前面的字母看作一个整体,所以 S\\rm SS 串的前 i\\rm ii 个字符与 P\\rm PP 串的前 j−2\\rm j - 2j2 个字符匹配。
f[i][j−2]\\rm f[i ][j - 2] f[i][j2]
2)当 ∗* 匹配 S\\rm SS1 个字符时:由于将 ∗* 字符与前面的字母看作一个整体,
所以 S\\rm SS 串的前 i−1\\rm i - 1i1 个字符与 P\\rm PP 串的前 j−2\\rm j - 2j2 个字符匹配,
S\\rm SS 串的第 i\\rm ii 个字符与 P\\rm PP∗\\rm * 前面的字符(即 j−1\\rm j-1j1 个字符)相等。
f[i−1][j−2]&&s[i]==p[j−1]\\rm f[i-1][j-2] \\&\\& s[i] == p[j - 1] f[i1][j2]&&s[i]==p[j1]
2)当 ∗* 匹配 S\\rm SS2 个字符时:由于将 ∗* 字符与前面的字母看作一个整体,所以 S\\rm SS 串的前 i−2\\rm i - 2i2 个字符与 P\\rm PP 串的前 j−2\\rm j - 2j2 个字符匹配,
S\\rm SS 串的第 i\\rm ii 个字符与 P\\rm PP∗\\rm * 前面的字符(即 j−1\\rm j-1j1 个字符)相等,
S\\rm SS 串的第 i−1\\rm i-1i1 个字符与 P\\rm PP∗\\rm * 前面的字符(即 j−1\\rm j-1j1 个字符)相等。
f[i−1][j−2]&&s[i]==p[j−1]&&s[i−1]==p[j−1]\\rm f[i-1][j-2] \\ \\&\\& \\ s[i] == p[j - 1]\\ \\&\\&\\ s[i-1]==p[j-1] f[i1][j2] && s[i]==p[j1] && s[i1]==p[j1]
以此类推……
得到
f[i][j]=f[i][j−2]∣∣f[i−1][j−2]&&s[i]==p[j−1]∣∣f[i−1][j−2]&&s[i]==p[j−1]&&s[i−1]==p[j−1]……\\rm f[i][j] = f[i][j - 2] || f[i-1][j-2] \\&\\& s[i] == p[j - 1]||f[i-1][j-2] \\ \\&\\& \\ s[i] == p[j - 1]\\ \\&\\&\\ s[i-1]==p[j-1] …… f[i][j]=f[i][j2]∣∣f[i1][j2]&&s[i]==p[j1]∣∣f[i1][j2] && s[i]==p[j1] && s[i1]==p[j1]……
由该公式知
f[i−1][j]=f[i−1][j−2]∣∣f[i−2][j−2]&&s[i−1]==p[j−1]∣∣f[i−2][j−2]&&s[i−1]==p[j−1]&&s[i−2]==p[j−1]……\\rm f[i-1][j]=f[i-1][j - 2]\\ ||\\ f[i-2][j-2] \\&\\& s[i-1] == p[j - 1]\\ ||\\ f[i-2][j-2] \\ \\&\\& \\ s[i-1] == p[j - 1]\\ \\&\\&\\ s[i-2]==p[j-1] …… f[i1][j]=f[i1][j2] ∣∣ f[i2][j2]&&s[i1]==p[j1] ∣∣ f[i2][j2] && s[i1]==p[j1] && s[i2]==p[j1]……
可得
f[i][j]=f[i][j−2]∣∣f[i−1][j]&&s[i]==p[j−1]\\rm f[i][j] = f[i][j-2]\\ ||\\ f[i-1][j]\\ \\&\\&\\ s[i] == p[j-1] f[i][j]=f[i][j2] ∣∣ f[i1][j] && s[i]==p[j1]
c++:

class Solution {
public:bool isMatch(string s, string p) {int n = s.size(),m = p.size();s = ' ' + s,p = ' ' + p;vector<vector<bool>> f(n + 1,vector<bool>(m + 1));f[0][0] = 1;for(int i = 0;i <= n;i++){for(int j = 1;j <= m;j++){if(j + 1 < s.size() && p[j + 1] == '*') continue;if(i && p[j] != '*') {f[i][j] = f[i - 1][j - 1] && (s[i] == p[j] || p[j] == '.');}if(p[j] == '*'){f[i][j] = f[i][j - 2] || i && f[i - 1][j] && (s[i] == p[j - 1] || p[j - 1] == '.');}}}return f[n][m];}
};