//这个题千万不要用recursive,不然超时哦!!!!
public static boolean isMatch3(String s, String p) {
int lens=s.length();
int lenp=p.length();
if(s==null||lens==0){
return lenp==0?true:false;
}
if(p==null||lenp==0){
return lens==0?true:false;
}
while(!s.equals("")&&!p.equals("")){
if(s.charAt(0)==(p.charAt(0))||p.charAt(0)=='?'){
return isMatch3(s.substring(1),p.substring(1));
}
if(p.charAt(0)=='*'){
if(p.length()==1)
return true;
String temp=new String(p);
if(isMatch3(s,p.substring(1)))
return true;
return isMatch3(s.substring(1),temp);
}
if(s.charAt(0)!=p.charAt(0)&&p.charAt(0)!='*'){
return false;
}
}
if(!s.equals("")){
return false;
}
while(!p.equals("")){
if(p.charAt(0)!='*'){
return false;
}
}
return true;
}
/*
* 44. Wildcard Matching
* 12.2 by Mingyang 跟下面的一道题目一样的,可以分情况讨论
* 首先明白一点,连续重复的*可以合并为一个*
* 那么这道题目没有通过recursive的NP来做,直接走的是index,这样不会超时
* 首先,遇到*的情况下就保留ij的值分别到mark,start,然后j++,j走i不走的意思是尝试第一种情况就是
* * match zero character,那么行不行继续看,如果不行,那么j退回到start+1的位置,i不是退回到
* mark,而是退回到mark+1,代表我们用刚才的* match一个试试,依次内推
*/
public static boolean isMatch2(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) == '*') { // 用start和mark分别记录一下当前的历史时间,这两个时间会被不断地重复,直到下次遇到*为止才更换
star = j;
mark = i;
j++;
//这一步是关键,匹配s中当前字符与p中‘*’后面的字符,如果匹配,则在第一个if中处理,如果不匹配,则继续比较s中的下一个字符。
//注意,这里j始终没变,为*下一个位置,但是i每次都加1,s中的下一个数字
} else if (star != -1) { // 如果这两个都不满足的话,前面出现了*那么j就改为start再往下一个走
j = star + 1;//这里的想法是在有*的情况下,如果不相等,j就可以退回到start的下一个,然后i既然从mark
i = mark+1;//出发不行,那么i就从mark的下一个试试,看能不能匹配,再不行,mark++,下次从下下个出发
mark++;
} else {
return false;
}
}
// 跳出来的情况就是i走完了,因为如果j走完了是会return false的,那么就看j能不能以*走到最后。
while (j < p.length() && p.charAt(j) == '*') {
++j;
}
return j == p.length();
}