原题链接
相似习题:通配符匹配
DP:
f
[
i
]
[
j
]
\rm f[i][j]
f[i][j]:表示长度
1
−
i
\rm 1-i
1−i 的
S
\rm S
S 串与长度
1
−
j
\rm1- j
1−j 的
P
\rm P
P 串是否匹配
①首先将
∗
*
∗ 字符与前面的字母看作一个整体。
②
p
[
j
]
≠
∗
\rm p[j] \ne *
p[j]=∗:
f
[
i
]
[
j
]
\rm f[i][j]
f[i][j]要想成立,则
S
\rm S
S 串前
i
−
1
\rm i - 1
i−1 个字符与
P
\rm P
P 串的前
j
−
1
\rm j-1
j−1 个字符匹配,同时满足
S
\rm S
S 串第
i
\rm i
i 个字符与
P
\rm P
P 串第
j
\rm j
j 个字符匹配或者,
P
\rm P
P 串第
j
\rm j
j 个字符为
′
.
′
'.'
′.′,即:
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 S
S 串任意多个字符:
1)当
∗
*
∗ 匹配
S
\rm S
S 串 0 个字符时:由于将
∗
*
∗ 字符与前面的字母看作一个整体,所以
S
\rm S
S 串的前
i
\rm i
i 个字符与
P
\rm P
P 串的前
j
−
2
\rm j - 2
j−2 个字符匹配。
f
[
i
]
[
j
−
2
]
\rm f[i ][j - 2]
f[i][j−2]
2)当
∗
*
∗ 匹配
S
\rm S
S 串 1 个字符时:由于将
∗
*
∗ 字符与前面的字母看作一个整体,
所以
S
\rm S
S 串的前
i
−
1
\rm i - 1
i−1 个字符与
P
\rm P
P 串的前
j
−
2
\rm j - 2
j−2 个字符匹配,
S
\rm S
S 串的第
i
\rm i
i 个字符与
P
\rm P
P 串
∗
\rm *
∗ 前面的字符(即
j
−
1
\rm j-1
j−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]
3)当
∗
*
∗ 匹配
S
\rm S
S 串 2 个字符时:由于将
∗
*
∗ 字符与前面的字母看作一个整体,所以
S
\rm S
S 串的前
i
−
2
\rm i - 2
i−2 个字符与
P
\rm P
P 串的前
j
−
2
\rm j - 2
j−2 个字符匹配,
S
\rm S
S 串的第
i
\rm i
i 个字符与
P
\rm P
P 串
∗
\rm *
∗ 前面的字符(即
j
−
1
\rm j-1
j−1 个字符)相等,
S
\rm S
S 串的第
i
−
1
\rm i-1
i−1 个字符与
P
\rm P
P 串
∗
\rm *
∗ 前面的字符(即
j
−
1
\rm j-1
j−1 个字符)相等。
f
[
i
−
2
]
[
j
−
2
]
&
&
s
[
i
]
=
=
p
[
j
−
1
]
&
&
s
[
i
−
1
]
=
=
p
[
j
−
1
]
\rm f[i-2][j-2] \ \&\& \ s[i] == p[j - 1]\ \&\&\ s[i-1]==p[j-1]
f[i−2][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
−
2
]
[
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-2][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−2][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];
}
};