您的位置:首页 > 其它

LeetCode 10 Regular Expression Matching

2017-01-09 14:51 417 查看
题意:

给出一个字符串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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: