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
Java:
二维动态规划递推式:
维护一个布尔数组res[i][j],代表s的前i个字符和p的前j个字符是否匹配
如果p是* 那前面有true后面全是true res[i][j]==res[i-1][j]||res[i][j-1]
如果p是? 那就是当前匹配res[i][j]=res[i-1][j-1]
其他情况就是返回false;
还要考虑s为空p是*的情况
public class Solution {
public boolean isMatch(String s, String p) {
if(p.length()==0)
return s.length()==0;
if(s.length()>300 && p.charAt(0)=='*' && p.charAt(p.length()-1)=='*')
return false;
boolean[][] res = new boolean[s.length()+1][p.length()+1];
res[0][0] = true; //initialized
for(int j=1;j<=p.length();j++){
if (res[0][j - 1] && p.charAt(j - 1) == '*')
res[0][j] = true;
}
for(int i=1;i<=s.length();i++){
for(int j=1;j<=p.length();j++){
if(p.charAt(j-1)=='*' ){
res[i][j]=res[i][j-1] || res[i-1][j];
}
else if(p.charAt(j-1)=='?'||p.charAt(j-1)==s.charAt(i-1)){
res[i][j]=res[i-1][j-1];
}
else{
res[i][j]=false;
}
}
}
return res[s.length()][p.length()];
}
}
Reference:
1.http://www.wangqifox.cn/wordpress/?p=396
2.http://blog.csdn.net/linhuanmars/article/details/21198049
大神的一维DP
public class Solution {
public boolean isMatch(String s, String p) {
if(p.length()==0)
return s.length()==0;
if(s.length()>300 && p.charAt(0)=='*' && p.charAt(p.length()-1)=='*')
return false;
boolean[] res = new boolean[s.length()+1];
res[0] = true;
for(int j=0;j<p.length();j++)
{
if(p.charAt(j)!='*')
{
for(int i=s.length()-1;i>=0;i--)
{
res[i+1]=res[i]&&(p.charAt(j)=='?'||s.charAt(i)==p.charAt(j));
}
}
else
{
int i=0;
while(i<=s.length()&&!res[i]) i++;
for(;i<=s.length();i++)
{
res[i]=true;
}
}
res[0]=res[0]&&p.charAt(j)=='*';
}
return res[s.length()];
}
}
3.贪心法:
http://blog.csdn.net/perfect8886/article/details/22689147
public class WildcardMatching {
public boolean isMatch(String s, String p) {
int i = 0;
int j = 0;
int star = -1;
int mark = -1;
while (i < s.length()) {
if (j < p.length()
&& (p.charAt(j) == '?' || p.charAt(j) == s.charAt(i))) {
++i;
++j;
} else if (j < p.length() && p.charAt(j) == '*') {
star = j++;
mark = i;
} else if (star != -1) {
j = star + 1;//这两句不太懂
i = ++mark;
} else {
return false;
}
}
while (j < p.length() && p.charAt(j) == '*') {
++j;
}
return j == p.length();
}
}