代码实现类似通配符的匹配

本文介绍了如何使用代码实现一个类似通配符的匹配功能,支持'.'和'*'的规则。'.'可以匹配任意单个字符,'*'可匹配零个或多个前面的元素。文章通过示例解释了匹配过程,并提供了思路。

 

 /**如题:
 *类似通配符的匹配
 * 说明:实现支持 '.' 和 '*' 的类似通配符的匹配,规则如下:
 *   1. '.' 匹配任意单个字符
 *   2. '*' 匹配零个或多个前面的元素
 *   3. isMatch(s, r); s 是匹配的目标字符串,r 是带匹配符的字符串
 *   4. r 的匹配应该覆盖 s
 * 
 * 示例:
 *   isMatch('aa','a') // return false
 *   isMatch('aa','aa') // return true
 *   isMatch('aaa','aa') // return false
 *   isMatch('aa', 'a*') // return true
 *   isMatch('aab', 'a*') // return false
 *   isMatch('aa', '.*') // return true
 *   isMatch('ab', '.*') // return true
 *   isMatch('ab', '.a') // return false
 *   isMatch('ab', '.b') // return true
 *   isMatch('aab', 'c*a*b') // return true
 */

 思路:为目标字符串s和带匹配符的字符串r分别设置标记q和t,设s为 ”aab”  r为 ”aacbaa*b”

 

/**
 *类似通配符的匹配
 * 说明:实现支持 '.' 和 '*' 的类似通配符的匹配,规则如下:
 *   1. '.' 匹配任意单个字符
 *   2. '*' 匹配零个或多个前面的元素
 *   3. isMatch(s, r); s 是匹配的目标字符串,r 是带匹配符的字符串
 *   4. r 的匹配应该覆盖 s
 * 
 * 示例:
 *   isMatch('aa','a') // return false
 *   isMatch('aa','aa') // return true
 *   isMatch('aaa','aa') // return false
 *   isMatch('aa', 'a*') // return true
 *   isMatch('aab', 'a*') // return false
 *   isMatch('aa', '.*') // return true
 *   isMatch('ab', '.*') // return true
 *   isMatch('ab', '.a') // return false
 *   isMatch('ab', '.b') // return true
 *   isMatch('aab', 'c*a*b') // return true
 */

    /**
     *
     * @param s 目标字符串
     * @param r 带匹配符的字符串
     * @param t 每次比较从r[t]开始
     * @param slen 初始化s串的长度,避免每次计算
     * @param rlen 初始化r串的长度,避免每次计算
     * @return 返回结果
     */
    public boolean isMatch (String s , String r , int t , int slen , int rlen) {
        //初始化s串的标记位为0
        int q = 0;
        while (s.charAt(q) == r.charAt(t) || r.charAt(t) == '*' || r.charAt(t) == '.') {
            if (r.charAt(t) == '*') {
                //此时r[t]=="*",则判断r[t-1]是否与s[q]相等,如果相等则q一直向前走直到s[q]!=r[t-1]或s串匹配结束
                while (r.charAt(t-1) == s.charAt(q) || r.charAt(t-1) == '.') {
                    q++;
                    //s串匹配到末尾说明匹配成功
                    if (q == slen) {
                        return true;
                    }
                }
            } else {
                //此时s[q]=r[t]或r[t]=".",无论哪种情况,q都向前走一步
                q++;
            }
            //每次循环t都要向前走一步
            t++;
            //s串匹配到末尾说明匹配成功
            if (q == slen) {
                return true;
            }
            //r串匹配到末尾,但s串还没有匹配完,说明匹配失败
            if (t == rlen ) {
                return false;
            }
        }
        //本次循环结束,走到着说明没有匹配成功,t向前走一步以便下次r串从r[t]的位置开始匹配
        t++;
        //r串匹配到末尾,但s串还没有匹配完,说明匹配失败
        if (t == rlen) {
            return false;
        }
//        if (r.charAt(t) == '*' || r.charAt(t) == '.') {
//            t++;
//        }
        return isMatch(s , r , t , slen , rlen);
    }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值