通配符匹配问题

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

‘?’ 可以匹配任何单个字符。
‘*’ 可以匹配任意字符串(包括空字符串)。
说明:

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

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

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

class Solution {
    public boolean isMatch(String s, String p) {
        if (p==null||p.isEmpty())return s==null||s.isEmpty();
    int i=0,j=0,istart=-1,jstart=-1,slen=s.length(),plen=p.length();
    //判断s的所有字符是否匹配
    while (i<slen){
        //三种匹配成功情况以及匹配失败返回false
        if (j<plen&&(s.charAt(i)==p.charAt(j)||p.charAt(j)=='?')){
            i++;
            j++;
        }else if (j<plen&&p.charAt(j)=='*'){
            istart=i;
            jstart=j++;
        }else if (istart>-1){
            i=++istart;
            j=jstart+1;
        }else {
            return false;
        }
    }
    //s中的字符都判断完毕,则认为s为空,此时需要p为空或者p中只剩下星号的时候,才能成功匹配。
    //如果p中剩余的都是*,则可以移除剩余的*
    while (j<plen&&p.charAt(j)=='*')j++;
    return j==plen;


    }

    /**
       总结 
       jstart、istart 分别记录的是p中 *的下标位置、 以及对应的s的下标位置(即当p中指针指到*时,s的指针位置)
        因为 *可以匹配任意字符,包括空字符  那么就先让 *匹配空字符
        此时 p中的指针位置位于*的后一位,s中的指针位置就是刚才istart指针的位置 
        然后开始进行匹配,如果不匹配 则
        p中的指针仍然回到*的后一位,而s中的指针位置+1(这是关键:这就代表着+1前s那个位置的字符就被当作是被*给匹配了)
        然后 让*的后一位继续 与 s中+1位置的那个位置 匹配

        以上是关键点、关键思路  其它细节 自己具体分析。
        比如  
        s : a b c d e f g h    p : a b * ? f g h
        p : a b * ? f g h

        核心思路:
          找到p中 *号的位置、以及*号即将要匹配的s中的那个字符的位置。 即 jstart、istart才是关键
    */
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值