美文网首页
面试题19:正则表达式匹配

面试题19:正则表达式匹配

作者: 繁星追逐 | 来源:发表于2019-08-29 17:00 被阅读0次

请实现一个函数用来匹配包括'.'和''的正则表达式。模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(包含0次)。

  • 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配

思路:
每次判断两个字符,使用递归首先判断什么时候递归停止,两种情况,一种是双方都走到最后一位,一种是模式走完,字符没有走完,返回false。
第二位为*:
* 前一位匹配:1,字符串移一位,模式不变 代表多个第一个字符
* 2,字符串移一位,模式移两位 代表只需要一个第一个字符
* 3,字符串不移,模式移两位 代表不需要第一个字符
* 前一位不匹配:字符串不移,模式移两位,
代表0个字符串
第二位不是: 1,第一位不同,返回false
2,第一位相同,共同移一位
换一种说法就是两种方式,只有可以继续递归,没有超出前,当前位相等,或者模式为.符号

 /**
     * 采用递归的方式,由于需要考虑第二位是否是*,当第二位是*,第一位匹配与否,关系不大,因此优先考虑第二位
     * 第二位为*:
     *         前一位匹配:1,字符串移一位,模式不变   *代表多个第一个字符
     *                    2,字符串移一位,模式移两位   代表只需要一个第一个字符
     *                    3, 字符串不移,模式移两位     代表不需要第一个字符
     *         前一位不匹配:字符串不移,模式移两位,*代表0个字符串
     * 第二位不是: 1,第一位不同,返回false
     *            2,第一位相同,共同移一位
     * @param str
     * @param pattern
     * @return
     */
    public boolean match(char[] str, char[] pattern)
    {
        if (str == null || pattern == null){
            return false;
        }
        return matchRecur(str,pattern,0,0);

    }

    private boolean matchRecur(char[] str, char[] pattern, int s, int p) {
        //有效性检验,两个都到末尾,匹配成功
        if (s == str.length && p == pattern.length){
            return true;
        }
        //最先需要考虑的一种情况,模式提前走完,字符串没有走完
        if (pattern.length == p && s < str.length){
            return false;
        }
        if (p < pattern.length-1 && pattern[p+1] == '*'){
            if ((s < str.length && str[s] == pattern[p]) || s<str.length && pattern[p] == '.'){
                return matchRecur(str,pattern,s+1,p+2) || matchRecur(str,pattern,s+1,p) || matchRecur(str,pattern,s,p+2);
            }else {
                return matchRecur(str,pattern,s,p+2);
            }
        }
        if ((s < str.length && str[s] == pattern[p]) || (s < str.length && pattern[p] == '.')){
            return matchRecur(str,pattern,s+1,p+1);
        }
        return false;

    }

相关文章

  • 正则表达式匹配

    《剑指offer》面试题19:正则表达式匹配 题目:请实现一个函数用来匹配包括'.'和''的正则表达式。模式中的字...

  • 剑指offer第二版-19.正则表达式匹配

    本系列导航:剑指offer(第二版)java实现导航帖 面试题19:正则表达式匹配 题目要求:实现正则表达式中.和...

  • 剑指offer学习笔记:8.2 字符串

    面试题53:正则表达式匹配请实现一个函数用来匹配包含'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符...

  • Nginx 匹配规则

    无 :默认匹配,普通匹配 = :精确匹配 ~* :匹配正则表达式,不区分大小写 ~ :匹配正则表达式,区分大小写 ...

  • 面试题19:正则表达式匹配

    请实现一个函数用来匹配包括'.'和''的正则表达式。模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以...

  • 面试题19:正则表达式匹配

    题目 请实现一个函数用来匹配‘.’和‘ * ’的正则表达式。模式中的字符‘.’表示任意一个字符,而‘*’表示它前面...

  • 面试题19:正则表达式匹配

    题目:请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面...

  • 面试题19:正则表达式匹配

    题目:请实现一个函数用来匹配包含‘.’和‘’的正则表达式。模式中的字符‘.’表示任意一个字符,而‘’表示它前面的字...

  • 2019.8.15分享:正则表达式字符匹配攻略

    一、正则表达式 正则表达式是匹配模式,要么匹配字符,要么匹配位置。 这次分享主要将提下正则表达式字符匹配 • 两种...

  • python与正则表达式 2020-01-02(未经允许,禁止转

    正则表达式 正则表达式与程序语言无关。正则表达式做匹配实际上就做3件事:【字符匹配】+【次数匹配】+【逻辑匹配】下...

网友评论

      本文标题:面试题19:正则表达式匹配

      本文链接:https://www.haomeiwen.com/subject/kvibectx.html