美文网首页
剑指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 | 正则表达式匹配

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