总结
1. 得到一个教训, 对于模拟题来说, 需要检查为空和越界两种情况
2. look ahead 在自动机类型题目中是非常必要的, 要根据两个字符来判断控制流的走向
代码
class Solution {
public:
bool isMatch(const char *s, const char *p) {
int len1 = strlen(s);
int len2 = strlen(p);
if(len1 == 0 && len2 == 0) return true;
//if(len1 == 0 && len2 != 0) return false;
if(len1 != 0 && len2 == 0) return false;
bool star = false;
if(len2 >= 2 && *(p+1) == '*') star = true;
if(!star) { // no star
if(len1 == 0)
return false;
if(p[0] == '.' || p[0] == s[0]) {
return isMatch(s+1, p+1);
}
return false;
}
// have star
if(p[0] == '.') {
for(int k = 0; k <= len1; k ++) {
if(isMatch(s+k, p+2))
return true;
}
} else {
if(isMatch(s, p+2))
return true;
for(int k = 1; k <= len1 && s[k-1] == p[0]; k ++) {
if(isMatch(s+k, p+2))
return true;
}
}
return false;
}
};