剑指offer19题正则表达式匹配

题目描述

请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配。

根据题意,字符串和模式串匹配可以是字符串中的一个字符去匹配模式串中的一个字符(如:a和a),也可以是字符串中的一个字符和模式串中的两个字符匹配(a和a*),还可以是字符串中的多个字符和模式串中的两个字符匹配(aaa和a*)。

因此我们主要关注模式串中的第二个字符是不是*,若不是则用模式串中的一个字符去匹配,若是则用两个字符去匹配。

首先我们先看第一个字符是否匹配,然后再看第二个字符是否是*

1、模式串第二个字符是*:
若第一个字符不匹配,则可以跳过模式串两个字符,用模式串中的第三个字符和字符串中的第二个字符匹配。
若第一个字符匹配,则有两种选择:1)用模式串的这两个字符继续匹配字符串的下一个字符 2)跳过模式串这两个字符,用模式串中第三个字符和字符串中第二个字符匹配。

2、模式串第二个字符不是*:
当第一个字符不匹配时,则返回false,若匹配则继续看字符串和模式串的第二个字符。

代码如下

public class Solution {
    public boolean match(char[] str, char[] pattern) {
        if (str == null || pattern == null) return false;
        return match(str, 0, pattern, 0);
    }

    private boolean match(char[] str, int i, char[] pattern, int j) {
        if (pattern.length == j)
            return str.length == i; //当字符串和模式串都匹配完时则匹配成功,若模式串匹配完但字符串没匹配完则匹配失败
        boolean firstMatch = (i != str.length) && (str[i] == pattern[j] || pattern[j] == '.');
        if (j < pattern.length - 1 && pattern[j + 1] == '*') { //第二个字符是*
            return match(str, i, pattern, j + 2) || (firstMatch && match(str, i + 1, pattern, j));
        } else {
            return firstMatch && match(str, i+1, pattern, j+1);
        }
    }
}

你可能感兴趣的:(leetcode)