通配符匹配(困难)
2020年7月5日
题目来源:力扣
解题
困难的我果然还是做不到,本题参考甜姨的题解,在此基础上,把两个字符数组先进行转换,不采用charAt(),速度从36ms提高到了17ms。
class Solution {
public boolean isMatch(String s, String p) {
int slen=s.length();
int plen=p.length();
char[] sarray=s.toCharArray();
char[] parray=p.toCharArray();
//建立二维数组
boolean[][] dp=new boolean[plen+1][slen+1];
//处理p前面有多个*的情况
dp[0][0]=true;
for(int i=1;i<=plen;i++){
if(parray[i-1]!='*')
break;
dp[i][0]=true;
}
//开始循环dp,用p做外圈,因为可能有*可以匹配任意字符串
for(int i=1;i<=plen;i++){
for(int j=1;j<=slen;j++){
//如果p的字符等于?或者与s相等
if(parray[i-1]==sarray[j-1] ||parray[i-1]=='?')
dp[i][j]=dp[i-1][j-1];
//如果p的字符等于*,有两种情况,第一种是p匹配了空字符,第二种是p匹配了s字符串
else if(parray[i-1]=='*')
dp[i][j]=dp[i-1][j] | dp[i][j-1];
}
}
return dp[plen][slen];
}
}