美文网首页
剑指offer | 正则表达式匹配

剑指offer | 正则表达式匹配

作者: icebreakeros | 来源:发表于2019-08-02 08:20 被阅读0次

正则表达式匹配

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

示例
输入:aaaaa*b*ac*a
输出:true
输入:aaaaa*b.ac*a
输出:false

分析:

  1. 模式串第二个字符是*
  • 首字母匹配或者模式串为.
    • *匹配0次:字符串不变,模式串后移两个字符
    • *匹配1次:字符串后移一个字符,模式串后移两个字符
    • *匹配多次:字符串后移一个字符,模式串不变
  • 首字母不匹配,字符串不变,模式串后移两个字符
  1. 模式串第二个字符不是*
  • 首字母匹配或者模式串为.,字符串和模式串均后移一个字符
  • 首字母不匹配,返回false
public class RegularExpressionsMatching {

    public boolean match(String input, String pattern) {
        if (input == null || pattern == null) {
            return false;
        }
        return matchCore(input, 0, pattern, 0);
    }

    private boolean matchCore(String input, int id, String pattern, int pd) {
        if (id == input.length() && pd == pattern.length()) return true;
        if (id != input.length() && pd == pattern.length()) return false;

        // 模式串第二个字符是*
        if (pd + 1 < pattern.length() && pattern.charAt(pd + 1) == '*') {
            if (input.charAt(id) == pattern.charAt(pd) 
                || (id != input.length() && pattern.charAt(pd) == '.')) {
                // 首字母匹配或者模式串为.
                // *匹配0次:字符串不变,模式串后移两个字符
                // *匹配1次:字符串后移一个字符,模式串后移两个字符
                // *匹配多次:字符串后移一个字符,模式串不变
                return matchCore(input, id, pattern, pd + 2)
                        || matchCore(input, id + 1, pattern, pd + 2)
                        || matchCore(input, id + 1, pattern, pd);
            } else {
                // 首字母不匹配,字符串不变,模式串后移两个字符
                return matchCore(input, id, pattern, pd + 2);
            }
        }

        // 模式串第二个字符不是*
        if (input.charAt(id) == pattern.charAt(pd) 
            || (id != input.length() && pattern.charAt(pd) == '.')) {
            // 首字母匹配或者模式串为.
            return matchCore(input, id + 1, pattern, pd + 1);
        }
        return false;
    }
}

相关文章

  • 正则表达式匹配

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

  • 字符串

    剑指offer所有的题目总结 牛客 正则表达式的匹配 leetcode的题目,解析描述更加全面 https://l...

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

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

  • 表示数值的字符串

    《剑指offer》面试题20:正则表达式匹配 题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例...

  • [剑指offer] 正则表达式匹配

    本文首发于我的个人博客:尾尾部落 题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'....

  • 剑指offer | 正则表达式匹配

    正则表达式匹配 请实现一个函数来匹配包含"."和"*"的正则表达式。模式中的字符"."表示任意一个字符,而"*"表...

  • [剑指Offer]正则表达式匹配

    本文首发于我的个人博客Suixin’s Blog原文: https://suixinblog.cn/2019/02...

  • 剑指offer - 正则表达式匹配

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

  • 全网最全剑指offer题目解答

    【剑指offer】Java版代码(完整版) 【剑指offer】1-10题 【剑指offer】11-20题 【剑指o...

  • 剑指offer|51-60题解题思路及代码(Java版)

    剑指offer51到60题总览: 构建乘积数组 正则表达式匹配 表示数值的字符串 字符流中第一个不重复的字符 链表...

网友评论

      本文标题:剑指offer | 正则表达式匹配

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