LeetCode 44.通配符匹配
确定状态:
和10题很类似,因为’.’和’?’作用相同,但是这
题中’*’可以匹配0个或多个任意字符
- 情况1:如果
B[n-1]
是一个正常字符(非?
非*
),则如果A[m-1]=B[n-1]
,能否匹
配取决于A[0..m-2]
和B[0..n-2]
是否匹配;否则不能匹配。 - 情况2:如果
B[n-1]
是?
,则A[m-1]
一定是和?
匹配,之后能否匹配取决于
A[0..m-2]
和B[0..n-2]
是否匹配 - 情况3:如果B[n-1]是
*
,它可以匹配0个或任意多个字符,需要考虑A[m-1]
有没
有被这个*
匹配:A[m-1]
不被*
匹配(即匹配0个),能否匹配取决于A[0..m-1]
和B[0..n-2]
是否匹配,
A[m-1]被‘*’匹配(任意多个字符),能否匹配取决于A[0..m-2]
和B[0..n-1]
是否匹配.
转移方程:
初始条件和边界情况:
设f[i][j]为A前i个字符A[0…i-1]和B前j个字符B[0…j-1]能否匹配
空串和空Wildcard匹配:f[0][0] = true
空的Wildcard不能匹配长度>0
的串
f[1][0] = … = f[m][0] = false
f[0][1..n]
也用动态规划计算,但是因为没有A[-1]
,所以只能用第二种情况中的f[i][j-1]
class Solution {
public boolean isMatch(String s, String p) {
char[] s1 = s.toCharArray();
char[] s2 = p.toCharArray();
int m = s1.length;
int n = s2.length;
boolean[][] f = new boolean[m+1][n+1];
int i,j;
for(i = 0;i <= m;i++){
for(j = 0;j <= n;j++){
if(i == 0 && j == 0){
f[i][j]=true;
continue;
}
if(j == 0){
f[i][j]=false;
continue;
}
if(s2[j-1] != '*'){
if(i > 0 && (s1[i-1] == s2[j-1] || s2[j-1] == '?')){
f[i][j] = f[i-1][j-1];
}
}
else{
f[i][j] |= f[i][j-1];
if(i>0)
f[i][j] |= f[i-1][j];
}
}
}
return f[m][n];
}
}