题意:
给出一个字符串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;
}
};