LeetCode "Wildcard Matching"

Here is the most elegant code I've seen to this problem:

http://yucoding.blogspot.com/2013/02/leetcode-question-123-wildcard-matching.html

Simply wow. I added a small tuning: multiple consecutive *s equal a single *:

class Solution {
public:
    bool _isMatch(const char *s, size_t lens, const char *p, size_t lenp)
    {
        const char *is = s, *ip = p;
        const char *star = NULL, *starss = NULL; // for *
        while (*is)
        {
            if (*ip == '?' || *ip == *is) { ip++; is++; continue; }
            if (*ip == '*') 
            {
                if (*(ip + 1) == 0) return true;
                star = ip ++;
                starss = is;
                continue;
            }
            if (star)
            {
                ip = star + 1;
                is = ++starss;
                continue;
            }
            return false;
        }

        return *ip == 0 || (*ip == '*' && *(ip + 1) == 0);
    }
    bool isMatch(const char *s, const char *p) {
        size_t lens = strlen(s);
        size_t lenp = strlen(p);
        if (lens == 0 && lenp == 0) return true;
        //    Shrink *s. 
        string sp;
        int id = 0, in = 0;
        char lst = 0;
        while (in < lenp)
        {
            char c = *(p + in);
            if (c == '*' && c == lst)
            {
                in++;
                continue;
            }
            else
            {
                sp += c;
                id++; in++;
                lst = c;
            }
        }
        return _isMatch(s, lens, sp.c_str(), sp.length());
    }
};
原文地址:https://www.cnblogs.com/tonix/p/3900476.html