题目大意:两个字符串是否匹配。
点 . 表示任意字符
*表示前面一个字符0个或任意个
解题思路:递归
当A[i] == B[j] 时, 返回A[i...length], B[j...length]的比较结果
当A[i] != B[j] 时, 直接返回false
当A[i] == B[j] 时,i一直加以直到A[i] != B[j]时,返回A[i...length],B[j + 2 ... length]的结果
class Solution {
public:
bool isMatch(const char *s, const char *p) {
if('\0' == *p) return '\0' == *s;
if(*(p + 1) != '*') {
if(*p == *s || (*p == '.' && *s != '\0'))
return isMatch(s + 1, p + 1);
return false;
}
while(*s == *p || (*p == '.' && *s != '\0')) {
if(isMatch(s, p + 2))
return true;
s++;
}
return isMatch(s, p + 2);
}
};
另外一种解题思路是动态规划
dp[i][j]表示字符串A前i个字符和B的前j个字符串是否匹配, A为字符串,B为模式串
当B[j] != '*' 时,
若A[i] == B[j], dp[i + 1][j + 1] = dp[i][j]
若A[i] != B[j], dp[i + 1][j + 1] = false
当B[j] == '*'时,
dp[i + 1][j + 1] = dp[i + 1][j] | dp[i + 1][j - 1] | (dp[i][j + 1] & A[i] == B[j - 1])
class Solution {
public:
bool isMatch(const char *s, const char *p) {
int slen = strlen(s);
int plen = strlen(p);
vector<vector<bool> > dp(slen + 1, vector<bool>(plen + 1, false));
dp[0][0] = true;
for(int i = 2; i <= plen; i++) {
if(p[i - 1] == '*')
dp[0][i] = dp[0][i - 2];
}
for(int i = 1; i <= slen; i ++) {
for(int j = 1; j <= plen; j++) {
if(p[j - 1] != '*') {
if(s[i - 1] == p[j - 1] || p[j - 1] == '.') {
dp[i][j] = dp[i - 1][j - 1];
}
} else {
dp[i][j] = dp[i][j - 1] | dp[i][j - 2] | (dp[i - 1][j] & (s[i - 1] == p[j - 2] || p[j - 2] == '.'));
}
}
}
return dp[slen][plen];
}
};