题目所属分类
DP问题
背包问题的变形
原题链接
给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。
‘?’ 可以匹配任何单个字符。
‘*’ 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。
说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。
代码案例:输入:
s = “aa”
p = “a”
输出: false
解释: “a” 无法匹配 “aa” 整个字符串。
题解
class Solution {
public boolean isMatch(String s, String p) {
int m=s.length(),n=p.length();
boolean f[][]=new boolean[m+1][n+1];
s=" "+s; p=" "+p;
f[0][0]=true;
// for (int i = 1; i <= n; ++i) {
// if (p.charAt(i - 1) == '*') {
// dp[0][i] = true;
// } else {
// break;
// }
// }
for (int i = 0; i <= m; i++) {//f(0,j)是有意义的 p可以是*
for (int j = 1; j <= n; j++) {//p不能为空
if (p.charAt(j) == '*') {
f[i][j] = f[i][j - 1] || i != 0 &&f[i - 1][j];
} else {
f[i][j] = (s.charAt(i) == p.charAt(j) ||p.charAt(j) == '?') && i != 0 && f[i - 1][j - 1];
}
}
}
return f[m][n];
}
}