一、题目
1、审题
2、分析:
判断两个字符串是否匹配,其中 p 中的特殊字符 ‘?’可以匹配任意一个字母, ‘*’ 可以匹配 0 个或多个不同的连续字符。
二、解答
1、思路:
①、定义两个指针,pIndex 指向 p 的下标, sIndex 指向 s 的下标;
再定义两个指针,pStarIndex 指向 p 中最新出现的星号出现时的后一个字符的位置, sMatch 指向 s 中当前确定要匹配入星号中的字符的下标;
②、在 sIndex 指向未超出 s 范围时,
a、当 s 与 p 单个字符匹配时, sIndex 与 pIndex 均向后移动一个单位;
b、当 p 中出现 ‘*’ 时,pStarIndex 记录 p 下标,且 pIndex 向后移动一个单位, sIndex 当前保持不变(即去除‘*’开始假使能够匹配当前字符串);
c、当出现字符不匹配时,pIndex 立马指向星号后一个字符,即 s中此字符算入 p中‘*’ 的匹配范围内;
③ 若 sIndex 已经指完最后一个字符时, 判断 pIndex 是否已经指完 p 的字符,或者 p 的后续字符只剩下 ‘*’,此时返回 true,否则 false;
public boolean isMatch(String s, String p) { int sIndex = 0, pIndex = 0; // s、p 遍历时的下标 int sMatch = 0; // 记录 s 开始与 p 的星号开始 匹配的下标 int pStarIndex = - 1; // p 星号的 下表 while(sIndex < s.length()) { if(pIndex < p.length() && (p.charAt(pIndex) == '?' || p.charAt(pIndex) == s.charAt(sIndex))) { sIndex++; pIndex++; } else if(pIndex < p.length() && p.charAt(pIndex) == '*') { pStarIndex = pIndex++; // pIndex 向后移动 sMatch = sIndex; // sIndex 不移动 } else if(pStarIndex != -1) { // p与s字符不匹配时,p 中存在 * pIndex = pStarIndex + 1; // pIndex 重新从星号后边开始 sIndex = ++sMatch; } else return false; } while(pIndex < p.length() && p.charAt(pIndex) == '*') pIndex++; return pIndex == p.length(); }
2、有时间研究这篇大佬博客
https://blog.csdn.net/jmspan/article/details/51460021