/*
* 算法思想:
* 动态规划,dp[i][j]表示s字符串到i时,p字符串到j时,是否能匹配成功;
* 例如:
* 字符串s为"abcdeft",p为"a*cd?f*t"
* 则生成的dp数组为:
1, 0, 0, 0, 0, 0, 0, 0, 0,
0, 1, 1, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 0, 0, 0,
0, 0, 1, 1, 0, 0, 0, 0, 0,
0, 0, 1, 0, 1, 0, 0, 0, 0,
0, 0, 1, 0, 0, 1, 0, 0, 0,
0, 0, 1, 0, 0, 0, 1, 1, 0,
0, 0, 1, 0, 0, 0, 0, 1, 1,
* 其中第0行表示当s为NULL时,与p的匹配结果;第0列表示当p为NULL时,与s的匹配结果。均为NULL时,dp[0][0] = 1;
* 详见代码注释。
*
*/
void print(int m, int n, bool dp[m+1][n+1]) {
int i, j;
for(i=0; i<=m; i++){
for(j=0; j<=n; j++){
printf("%8d,", dp[i][j]);
}
printf("\n");
}
printf("--------\n");
}
bool isMatch(char * s, char * p){
int m = strlen(s), n = strlen(p), i, j, k;
bool dp[m+1][n+1];
dp[0][0] = 1;
for(i=1; i<=m; i++){
dp[i][0] = 0;
}
for(i=1; i<=n; i++){
if(p[i-1] != '*'){
dp[0][i] = 0;
}else{
dp[0][i] = dp[0][i-1];
}
}
for(i=0; i<m; i++){
for(j=0; j<n; j++){
if(s[i] == p[j] || p[j] == '?') {
/* 当当前位置两字符相等或者p[j]=='?'时,只能看两串的前一个位置是否匹配 */
dp[i+1][j+1] = dp[i][j];
}else if(p[j] == '*') {
/* 当当前位置p[j] == '*'时,情况比较多:
* 1. 如果i-1和j-1位置匹配则,当前i,j匹配成功;
* 2. 如果i,j-1,匹配成功,则当前i,j匹配成功;
* 3. 如果i-1,j匹配成功,则当前i,j匹配成功;
* 4. 上述三种情况任一为1,则当前dp[i][j] = 1;
* 5.
*/
dp[i+1][j+1] = dp[i][j] || dp[i+1][j] || dp[i][j+1];
}else {
/* 其他情况无法进行匹配 */
dp[i+1][j+1] = 0;
}
}
}
//print(m, n, dp);
return dp[m][n];
}
leetcode-44. 通配符匹配-C语言
最新推荐文章于 2020-12-24 15:36:05 发布