以一个例子详解动态规划转移方程:
S = abbbbc
P = ab* d*c
当 i, j 指向的字符均为字母(或 ‘.’ 可以看成一个特殊的字母)时,
只需判断对应位置的字符即可,
若相等,只需判断 i,j 之前的字符串是否匹配即可,转化为子问题 f[i-1][j-1].
若不等,则当前的 i,j 肯定不能匹配,为 false.
如果当前 j 指向的字符为 ’ *’,则不妨把类似 ‘a *’, ‘b *’ 等的当成整体看待。
本质上只会有两种情况:
匹配 S 末尾的一个字符,将该字符扔掉,而该组合还可以继续进行匹配;
不匹配字符,将该组合扔掉,不再进行匹配。
状态转移方程:
class Solution {
public:
bool isMatch(string s, string p) {
int ns = s.length();
int np = p.length();
//int dp[ns+1][np+1];
vector<vector<int>> dp(ns + 1, vector<int>(np + 1));
dp[0][0]=true;
for(int i=1;i<=np;i++){
if(i-2>=0&&p[i-1]=='*'&&p[i-2]) {
dp[0][i]=dp[0][i-2];
}
}
for(int i=1;i<=ns;i++){
for(int j=1;j<=np;j++){
if(p[j-1] == s[i-1] || p[j-1] == '.')
dp[i][j] |= dp[i-1][j-1];
if(p[j-1]=='*'){
dp[i][j] |= dp[i][j-2];
if(p[j-2] == s[i-1] || p[j-2] == '.'){
dp[i][j] |= dp[i-1][j];
}
}
}
}
return dp[ns][np];
}
};