**leetcode 44 Wildcard Matching

没做出来
Time Limit Exceeded

class Solution {
public:

    typedef string::iterator SIt;

    bool isMatch(string s, string p) {

        send = s.end();
        pend = p.end();
        return isMatchRecursion(s.begin(), p.begin());
    }

private:
    bool isMatchRecursion(SIt sb, SIt pb) {
        SIt sit = sb;
        SIt pit = pb;

        while (sit != send && pit != pend) {

            if (*sit == *pit || *pit =='?') {
                ++sit;
                ++pit;
                continue;
            } 

            break;
        }

        if (pit == pend && sit == send) return true;
        if (pit == pend && sit != send) return false;
        if (sit == send && *pit != '*')  return false;

        // sit == send OR sit != send
        if (*pit == '*') {
            ++pit;
            for (SIt it = sit; it <= send; ++it) {
                if (isMatchRecursion(it, pit)) return true;       
            }
            return false;
        }

        // sit != send && pit != '*';
        return false; // *sit != *pit

    }

    SIt pend;
    SIt send;
};

参考后
1. 迭代

class Solution {
public:
    typedef string::iterator SIt;
    typedef string::size_type sz;

    bool isMatch(string s, string p) {
        sz i = 0; // id of s
        sz j = 0;

        sz ss = 0; // 标记与p中‘*’对应的点
        sz pp = 0; // 标记'*'处
        sz sSize = s.size();
        sz pSize = p.size();

        while ((i != sSize) && (i != pSize) && (s[i] == p[i] || p[i] == '?')) {
            ++i;
        }

        if (i == pSize) {
            if (i == sSize) return true;
            if (i != sSize) return false;

        } 

        // s 到头, 
        // p 与 s 不相等
        // 以上两种情况中只有p[i] == '*' 时才有可能返回true
        if (p[i] == '*') {

            j = i;
            ss = i;

            pp = j; // the id of the position of astroid
            j = pp + 1;

            if (j == pSize) return true;

            while (i != sSize) {
                if (p[j] == s[i] || p[j] == '?') {
                    ++i;
                    ++j;
                } else if (p[j] == '*') {
                    ss = i;
                    pp = j;
                    j = pp + 1;
                    if (j == pSize) return true;
                } else {
                    i = ++ss;
                    j = pp + 1;  // 重新找
                }       
            }

            // 如果p剩下的都是'*' 或都是没有了返回true
            while (j != pSize) {
                if (p[j] != '*') {
                    return false;
                }
                ++j;
            }
            return true;
        }

        // 其余的返回 false;
        return false; 
    }
};

2,动态规划

class Solution {
public:
    typedef string::size_type sz;

    bool isMatch(string s, string p) {

        // dynamic programming

        const sz sSize = s.size();
        const sz pSize = p.size();

        vector<int> cols(pSize + 1, false); 
        vector<vector<int> >  tab(sSize + 1, cols);

        tab[0][0] = true;

        for (sz j = 0; j != pSize; ++j) {
            if (tab[0][j] == true && p[j] == '*')
                tab[0][j + 1] = true;
        }

        for (sz j = 0; j != pSize; ++j) {
            if (p[j] == '*') {
                for (sz i = 0; i <= sSize; ++i) {
                     if (tab[i][j] == true) {
                        for (sz k = i; k <= sSize; ++k) {
                            tab[k] [j + 1] = true;
                        }
                        break;
                    } 
                }

            } else {
                for (sz i = 0; i != sSize; ++i) {
                    if (tab[i][j] == true && (p[j] == s[i] || p[j] == '?')) {
                        tab[i + 1][j + 1] = true;
                    }
                }
            }
        } 
        return tab[sSize][pSize];
    }
};

/* 这个循环方式更高效
        for (sz j = 1; j <= pSize; ++j) {
            for (sz i = 1; i <= sSize; ++i) {
                if (p[j - 1] == '*') {
                    tab[i][j] = tab[i][j - 1] || tab[i - 1][j];
                } else {
                    if (tab[i - 1][j - 1] == true && (p[j - 1] == s[i - 1] || p[j - 1] == '?')) {
                        tab[i][j] = true;
                    }
                }
            }
        }
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值