Skip to content

Latest commit

 

History

History
61 lines (61 loc) · 2.14 KB

44.md

File metadata and controls

61 lines (61 loc) · 2.14 KB

#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();
    }
}