public class Solution {
public bool IsMatch(string s, string p) {
int i = 0;
int j = 0;
int iStar = -1;
int jStar = -1;
int m = s.Length;
int n = p.Length;
while(i < m)
{
if(j < n && (s[i] == p[j] || p[j] == '?'))
{
//i,j后移
++i;
++j;
}
else if(j < n && p[j] == '*')
{
//如果之后序列匹配不成功,记录i和j需要回溯到的位置
iStar = i;//记录星号
jStar = j++;//记录星号,并且j移到下一位,准备下个循环s[i]和p[j]的匹配
}
//发现字符不匹配且没有星号出现,但是istar>0,说明可能是*匹配的字符数量不对,此时回溯
else if(iStar >= 0)
{
//i回溯到istar+1,从istar+1再开始试,同时更新回溯位置
i = ++iStar;
//j回溯到jstar+1,重新使用p串*后的部分开始对s串istar位置及之后字符的匹配
j = jStar + 1;
}
else
return false;
}
while (j < n && p[j] == '*')
//考虑末尾多余的星号
++j;
return j == n;
}
}
Leetcode -通配符匹配
最新推荐文章于 2021-02-03 21:30:45 发布