class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @param p string字符串
* @return bool布尔型
*/
bool isMatch(string s, string p) {
// write code here
int n = s.size(), m = p.size();
int i = 0, j = 0; // i指向s,j指向p
int start = -1; // 最近一次出现'*'的位置
int match = 0; // 当star记录时,s中匹配开始的位置
while (i < n) {
if (j < m && (p[j] == '?' || p[j] == s[i])) {
// 当前字符可匹配:普通相等或'?'
++i; ++j;
} else if (j < m && p[j] == '*') {
// 记录星号,并先让它匹配空串
start = j;
match = i;
++j;
} else if (start != -1) {
// 之前有'*',回溯:让'*'多吃一个字符
j = start + 1;
++match;
i = match;
} else {
return false; // 无法匹配且没有可回溯的'*'
}
}
// p剩下的必须全是'*'
while (j < m && p[j] == '*') ++j;
return j == m;
}
};