这个问题我看的别人的,用的动态规划解决。
- dp[i][j]表示的是s的前i个字符和p的前j个字符是否匹配;
- 首先要使从1到最后初始化为false;
- 然后初始化dp[0][0],表示前0个字符肯定匹配;
- 然后根据是否是*来初始化边缘的dp值,如果s是是全*,则dp[i][0]全是true;
- 最后要匹配中间的字符,根据是否有* 和是否有?来判断,最后根据是否相等来判断;
- 返回d[lenS][lenP];
C++ 代码:
class Solution {
public:
/**
* @param s: A string
* @param p: A string includes "?" and "*"
* @return: A boolean
*/
bool isMatch(const char *s, const char *p) {
if (s==NULL && p==NULL) {
return true;
}
if (s==NULL || p==NULL) {
return false;
}
int lenS = strlen(s);
int lenP = strlen(p);
bool dp[lenS+1][lenP+1];//dp[i][j]表示s的前i个字符和p的钱j个字符是匹配的
for (int i=1; i<=lenS; i++) {
for (int j=1; j<=lenP; j++) {
dp[i][j] = false;
}
}
dp[0][0] = true;
for (int i=1; i<=lenS; i++) {
if (dp[i-1][0]==true && s[i-1] == '*' ) {
dp[i][0] = true;
}else {
dp[i][0] = false;
}
}
for (int i=1; i<=lenP; i++) {
if (dp[0][i-1]==true && p[i-1] == '*') {
dp[0][i] = true;
} else {
dp[0][i] = false;
}
}
for (int i=1; i<=lenS; i++) {
for (int j=1; j<=lenP; j++) {
if (s[i-1] == '*' || p[j-1] == '*') {
dp[i][j] = dp[i-1][j] || dp[i][j-1];
} else if (s[i-1]=='?'||p[j-1]=='?') {
dp[i][j] = dp[i-1][j-1];
} else {
dp[i][j] = ((s[i-1]==p[j-1]?true : false) && dp[i-1][j-1]);
}
}
}
return dp[lenS][lenP];
}
};