# 44 - Wildcard Matching

解法一 - Two pointer

這題直觀的做法是用兩個 pointer,一個指向 p,一個指向 s,就像我們用兩根手指頭指向兩個 string 去比對。

class Solution {
public:
    bool isMatch(string s, string p) {
        int m = s.length(), n = p.length();
        int i=0, j=0, star=-1, match;

        while(i < m) {
            // one-to-one match, keep going
            if(j<n && (s[i] == p[j] || p[j] == '?')) {
                i++;
                j++;
            }
            // 碰到 *,假設它 match 空字串 "",用 star 記錄 * 位置,j 後移
            // 雖然 match = i,但意義上是假設 * match 到 "",而非 s[i]
            // 若要理解,可以跟下一個 else if 部分中的 i = match 一起看
            else if(j<n && p[j] == '*') {
                match = i;
                star = j;
                j++;
            } 
            // 會進到這個條件,表示當前的 s[i] 跟 p[j] 無法 match
            // 而且也没有 *,所以 
            // s[i] 有可能是 match 到上一個 *(或 s[i] 前的某些 letter 要 match 到 *,s[i] 才能正確 match)
            // 做法是,首先將 j 回退到 * 的下一個位置
            // match 不能只是 match 剛遇到 * 的地方了,要多 match 一個 letter
            // i 回到 match,這步代表我們用 * match 了一個 letter
            else if(star >= 0) {
                j = star+1;  
                match++;
                i = match; 
            }
            else return false;
        }

        // If there are remaining *, we treat them as matches to ""
        while(j<n && p[j] == '*') j++;

        return j == n;
    }
};

Last updated