Wildcard Matching 题解


题目描述

Wildcard Matching
即判断字符串与正则表达式(只支持'?''*')是否匹配。
'?'匹配任意一个字符,'*'匹配任意一个序列。
如:"abab""*??ab"返回true

题解

与之前做过的正则表达式匹配类似。

因为元字符'*'可以匹配的数量不定,最长匹配或最短匹配都无法适应,所以只能通过一个容器记录转移状态。类似于状态转移图,所以简单两层循环即可。外循环遍历字符串,内循环寻找匹配的下一个状态。当最终完成遍历且最后状态中有两字符串最后匹配状态即匹配成功,反之失败。

代码

class Solution {
public:
    bool isMatch(std::string s, std::string p) {
        int lenS = s.size(), lenP = p.size();
        int *vec = (int*)malloc(sizeof(int) * (lenS + 1 << 1)), *tmpVec = vec + lenS + 1;
        vec[0] = 0;
        int vecLen = 1, tmpVecLen = 0;
        for (int j = 0; j < lenP; ++j) {
            char cur = p[j];
            if (cur == '*') {
                for (int i = vec[0]; i <= lenS; ++i)
                    tmpVec[tmpVecLen++] = i;
            } else {
                for (int k = 0; k < vecLen; ++k)
                    if (vec[k] < lenS && (cur == '?' || cur == s[vec[k]]))
                        tmpVec[tmpVecLen++] = vec[k] + 1;
            }
            if (tmpVecLen == 0)
                return false;
            int* tmp = vec; vec = tmpVec; tmpVec = tmp;
            vecLen = tmpVecLen; tmpVecLen = 0;
        }
        bool result = vecLen && vec[vecLen - 1] == lenS;
        free(vec < tmpVec ? vec : tmpVec);
        return result;
    }
};

总结

主要应用了状态转移图思想。


Caesar
53 声望1 粉丝

Hustle-As-A-Service


下一篇 »
Jump Game II