力扣:正则表达式匹配
原题链接
DP:
f[i][j]\\rm f[i][j]f[i][j]:表示长度 1−i\\rm 1-i1−i 的 S\\rm SS 串与长度 1−j\\rm1- j1−j 的 P\\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 - 1i−1 个字符与 P\\rm PP 串的前 j−1\\rm j-1j−1 个字符匹配,同时满足 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[i−1][j−1]&&(s[i]==p[j]∣∣p[j]==′.′)
③p[j]=∗\\rm p[j] =*p[j]=∗:
∗*∗ 会匹配 S\\rm SS 串任意多个字符:
1)当 ∗*∗ 匹配 S\\rm SS 串 0 个字符时:由于将 ∗*∗ 字符与前面的字母看作一个整体,所以 S\\rm SS 串的前 i\\rm ii 个字符与 P\\rm PP 串的前 j−2\\rm j - 2j−2 个字符匹配。
f[i][j−2]\\rm f[i ][j - 2] f[i][j−2]
2)当 ∗*∗ 匹配 S\\rm SS 串 1 个字符时:由于将 ∗*∗ 字符与前面的字母看作一个整体,
所以 S\\rm SS 串的前 i−1\\rm i - 1i−1 个字符与 P\\rm PP 串的前 j−2\\rm j - 2j−2 个字符匹配,
S\\rm SS 串的第 i\\rm ii 个字符与 P\\rm PP 串 ∗\\rm *∗ 前面的字符(即 j−1\\rm j-1j−1 个字符)相等。
f[i−1][j−2]&&s[i]==p[j−1]\\rm f[i-1][j-2] \\&\\& s[i] == p[j - 1] f[i−1][j−2]&&s[i]==p[j−1]
2)当 ∗*∗ 匹配 S\\rm SS 串 2 个字符时:由于将 ∗*∗ 字符与前面的字母看作一个整体,所以 S\\rm SS 串的前 i−2\\rm i - 2i−2 个字符与 P\\rm PP 串的前 j−2\\rm j - 2j−2 个字符匹配,
S\\rm SS 串的第 i\\rm ii 个字符与 P\\rm PP 串 ∗\\rm *∗ 前面的字符(即 j−1\\rm j-1j−1 个字符)相等,
S\\rm SS 串的第 i−1\\rm i-1i−1 个字符与 P\\rm PP 串 ∗\\rm *∗ 前面的字符(即 j−1\\rm j-1j−1 个字符)相等。
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[i−1][j−2] && s[i]==p[j−1] && s[i−1]==p[j−1]
以此类推……
得到
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][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−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[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[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][j−2] ∣∣ f[i−1][j] && s[i]==p[j−1]
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];}
};