题目描述
思路分析
线性dp
f
[
i
]
[
j
]
f[i][j]
f[i][j] 表示
s
s
s数组
[
1
,
i
]
[1,i]
[1,i]和
p
p
p数组的
[
1
,
j
]
[1,j]
[1,j]是否匹配。
第10题中
∗
*
∗需要依赖于前一个字符,而第44题中的
?
?
?本就可以匹配任意字符串。这是两题的略微区别。其余大体思路一致:看
P
[
j
]
P[j]
P[j]是否匹配。
代码实现
class Solution {
public:
bool isMatch(string s, string p) {
int n=s.size(),m=p.size();
s=' '+s,p=' '+p;
vector<vector<bool>> dp(n+1,vector<bool>(m+1));
dp[0][0]=true;
for(int i=0;i<=n;i++){
for(int j=1;j<=m;j++){
if(j+1<=m&&p[j+1]=='*') continue;
else if(i&&p[j]!='*'){
dp[i][j]=dp[i-1][j-1]&&(s[i]==p[j]||p[j]=='.');
}
else if(p[j]=='*'){
dp[i][j]=dp[i][j-2]||i&&dp[i-1][j]&&(s[i]==p[j-1]||p[j-1]=='.');
}
}
}
return dp[n][m];
}
};