通配符匹配

给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。

‘?’ 可以匹配任何单个字符。
‘*’ 可以匹配任意字符串(包括空字符串)。
两个字符串完全匹配才算匹配成功。

说明:

s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。
示例 1:

输入:
s = “aa”
p = “a”
输出: false
解释: “a” 无法匹配 “aa” 整个字符串。
示例 2:

输入:
s = “aa”
p = ""
输出: true
解释: '
’ 可以匹配任意字符串。
示例 3:

输入:
s = “cb”
p = “?a”
输出: false
解释: ‘?’ 可以匹配 ‘c’, 但第二个 ‘a’ 无法匹配 ‘b’。
示例 4:

输入:
s = “adceb”
p = “ab”
输出: true
解释: 第一个 ‘’ 可以匹配空字符串, 第二个 '’ 可以匹配字符串 “dce”.
示例 5:

输入:
s = “acdcb”
p = “a*c?b”
输入: false

方法:逐个比较
思路:
1,将字符串s和p的字符挨个比较,i和j指针分别记录位置,如果相同或者p的j位置字符为’?’,则将i和j指针前进一步;
2,如果不满足第一步条件,但是此时p的j位置字符为 通配符’*’,那么就记录此时i和j的位置,并且将j前进一步;
3,再将i和前进一步的j重复,第一步的操作,如果还是不匹配,那么就需要通配符的匹配,就将当前i位置的元素直接匹配掉,拿着下一个元素和j位置的元素继续比较,并且更新记录中记录的位置;
4,如果没有完全匹配,或者匹配过程有错误,直接返回false;否则就直到将s字符串完全匹配完成;
5,如果已经完全匹配,但是p字符串指针j还没有遍历完成,那么就需要此时p剩下的字符串全部是通配符才算完全匹配,否则就返回false;
6,全部遍历完成,就说明匹配成功,返回true;

class Solution {
    public boolean isMatch(String s, String p) {
       //动态规划,逐个匹配
        int sl = s.length();
        int pl = p.length();
        //双指针移动两个元素
        int i = 0, j = 0;
        //记录匹配到'*'的位置,方便操作
        int marks = -1, markp = -1;
        while (i < sl) { 
            if (j != pl && (s.charAt(i) == p.charAt(j) || p.charAt(j) == '?')) {//直接字符匹配或者p里面是'?',直接走
                i ++;
                j ++;
            }
            else if (j != pl && p.charAt(j) == '*') {//是'*'时,记录当前i和j,并且先把j指针走一步
                marks = i;
                markp = j;
                j ++;
            }
            else if (markp != -1) {//j走一步后和i不匹配,则需要用'*'匹配掉当前i,所有i走一步,j退一步,再继续比较
                i = marks + 1;
                j = markp + 1;
                marks ++;
            }
            else {//没有完全匹配或者匹配不正确
                return false;
            }
        }
        while (j < pl) {//s已经完全匹配完,但是j指针还没有走完的情况
            if (p.charAt(j) == '*') 
                j ++ ;
            else
                return false;
        }
        return true;
    }
}

注意:主要就是通配符的匹配,可以匹配空字符,所以每次要先跳过在比较,后续不匹配再返回标记位置使用通配符匹配掉当前字符,重复操作直到出现匹配字符为止!

猜你喜欢

转载自blog.csdn.net/weixin_42156844/article/details/83898304