#44. Wildcard Matching 题目链接
public class Solution {
public boolean isMatch(String s, String p) {
/**
* sflag 参数s的下标
* pfalg 参数p的下标
* starflag 星号在p中的下标
* much 匹配两个星号的字符串,much是指s中的匹配开始的下标
* hasstar 是否有星号
*/
int sflag = 0, pflag = 0,starflag = 0,much = 0;
boolean hasstar = false;
while (sflag < s.length()) {
/**
* 如果是问号或者两个字符串中的字符匹配,两个flag都要++
* 然后进入下一轮匹配
*/
if (pflag < p.length() && (s.charAt(sflag) == p.charAt(pflag) || p.charAt(pflag) == '?')) {
sflag++;
pflag++;
}
/**
* 如果遇到了星号,记录下星号的位置,并且pflag++,p从星号后开始匹配
* s则从当前位置开始匹配,所以much等于sflag
* hasstar标志位置为true
*/
else if (pflag < p.length() && p.charAt(pflag) == '*') {
starflag = pflag;
pflag++;
much = sflag;
hasstar = true;
}
/**
* 如果进入了这个循环之中,说明星号后面的“一次”匹配不成功
* 所以要将匹配位++,把sflag置为much,从sflag重新开始匹配
* 直到匹配到s字符串的结束或者p再次遇到星号
*/
else if (hasstar == true) {
pflag = starflag + 1;
much ++;
sflag = much;
}
/**
* 说明匹配不成功,返回false
*/
else {
return false;
}
}
/**
* 如果字符串p是以XXX**结束的情况,在最后进行特殊处理
*/
while (pflag < p.length() && p.charAt(pflag) == '*') {
pflag++;
}
return pflag == p.length();
}
}