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; } };