qingcheng奕  

https://oj.leetcode.com/problems/wildcard-matching/

模拟通配符的匹配

做法非常好

 class Solution {
public:
    bool isMatch(const char *s, const char *p) {
        bool hasStar = false;
        const char *str,*ptr;
        for(str = s,ptr = p; *str != '\0'; str++,ptr++)
        {
            switch(*ptr)
            {
                // 相当于做了一次匹配,都往前走1
                case '?':
                    break;
                case '*':
                    hasStar = true;
                    s = str; // 记录,前面的已经处理好了
                    p = ptr;
                    while(*p == '*') p++; // 相当于把*先映射成空
                    if(*p == '\0')
                        return true;
                    str = s - 1;
                    ptr = p - 1;
                    break;
                default:
                    if(*str != *ptr)
                    {
                        if(!hasStar)
                            return false;
                        s++; // s往前挪一个,相当于 * 多映射一个 回到出现*的位置开始 再往前加一个 再进行下面的匹配
                        str = s -1;
                        ptr = p -1;
                    }
            }
        }
        while(*ptr == '*')
            ptr++;
        return (*ptr == '\0');
    }
};

 

posted on 2014-08-17 17:25  qingcheng奕  阅读(123)  评论(0编辑  收藏  举报