LeetCode 10 Regular Expression Matching

来源:互联网 发布:激光祛痘的危害 知乎 编辑:程序博客网 时间:2024/06/09 15:58

题意:

给出一个字符串s和一个模式串p,p中"."表示任意单个字符,"*"表示"*"前面的字符个数为任意个,判断p能否表示s。


思路:

我使用了dfs方式,先把p解析成<char, count>结构的列表L,即某个字符允许出现几次。然后按顺序将L与s做验证,对"*"的处理方法是简单枚举个数。最后判断L与s是否同时结束。

注意,同时结束的意思是在s结束时L也结束或者L剩下的元素中count都是"*"。

求更快速的解法??


代码:

//// Created by house on 1/9/17.//class Solution {public:    bool isMatch(string s, string p) {        ch.clear();        cnt.clear();        len = 0;        sl = s.size();        ss = s;        for (int i = 0; i < p.size(); ++i) {            ++len;            ch.push_back(p[i]);            if (i + 1 < p.size() && p[i + 1] == '*') {                ++i;                cnt.push_back(-1);            } else {                cnt.push_back(1);            }        }        return dfs(0, 0);    }private:    vector<char> ch;    vector<int> cnt;    int len;    int sl;    string ss;    bool dfs(int si, int ci) {        if (si == sl && ci == len) {            return true;        } else if (si == sl && ci != len) {            for (int i = ci; i < len; ++i) {                if (cnt[i] != -1) {                    return false;                }            }            return true;        } else if (si != sl && ci == len) {            return false;        }        if (cnt[ci] != -1) {            if (ch[ci] != '.') {                for (int i = 0; i < cnt[ci]; ++i) {                    if (ss[si + i] != ch[ci]) {                        return false;                    }                }            }            return dfs(si + cnt[ci], ci + 1);        }        for (int i = 0; i <= sl - si; ++i) {            if (i == 0 || ch[ci] == '.' || ss[si + i - 1] == ch[ci]) {                if (dfs(si + i, ci + 1)) {                    return true;                }            } else {                break;            }        }        return false;    }};


0 0
原创粉丝点击