剑指offer | 正则表达式匹配

2019-08-02  本文已影响0人  icebreakeros

正则表达式匹配

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

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

分析:

  1. 模式串第二个字符是*
  1. 模式串第二个字符不是*
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;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读