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;
}
};
总结
主要应用了状态转移图思想。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。