Implement wildcard pattern matching with support for '?'
and '*'
.
'?' Matches any single character.
'*' Matches any sequence of characters (including the empty sequence).
The matching should cover the entire input string (not partial).
The function prototype should be:
bool isMatch(const char *s, const char *p)
Some examples:
isMatch("aa","a") ? false
isMatch("aa","aa") ? true
isMatch("aaa","aa") ? false
isMatch("aa", "*") ? true
isMatch("aa", "a*") ? true
isMatch("ab", "?*") ? true
isMatch("aab", "c*a*b") ? false
实现通配符匹配,有点像之前.*匹配,本来也是用递归做,但是超时
于是改成以前解决背包问题的类似方法,用动态规划dp数组
dp[i][j] 表示p[i]与s[j]的匹配情况,可以分为:
如果p[i]=*,则dp[i][j]=dp[i-1][j-1] || dp[i-1][j] || dp[i][j-1] ;
如果p[i]=? || p[i]=s[j],则dp[i][j]=dp[i-1][j-1];
最后返回dp[m][n]即可。
其实与递归的公式是一样的,主要是对*处理:T(i,j)=T(i-1,j) || T(i,j-1) || T(i-1,j-1)
public boolean isMatch(String s, String p) {
if(s==null||p==null)return false;
if(p.length()<1&&s.length()<1)return true;
if(p.length()<1&&s.length()>0)return false;
if(s.length()<1&&p.length()>0&&p.charAt(0)!='*'){
return false;
}
int m=p.length();
int n=s.length();
boolean dp[][] = new boolean[m+1][n+1];
dp[0][0]=true;
for(int i=1;i<=m;i++){
if(p.charAt(i-1)=='*'){
dp[i][0]=dp[i-1][0];
for(int j=1;j<=n;j++){
dp[i][j]=dp[i-1][j-1]||dp[i-1][j]||dp[i][j-1];
}
}
else{
for(int j=1;j<=n;j++){
if(p.charAt(i-1)==s.charAt(j-1)||p.charAt(i-1)=='?'){
dp[i][j]=dp[i-1][j-1];
}
}
}
}
return dp[m][n];
}