您的位置:首页 > 其它

leetcode 44. Wildcard Matching

2017-07-14 16:08 288 查看
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]
即可。


其实与递归的公式是一样的,主要是对*处理: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]
;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 leetcode