正则表达式匹配

题目描述

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

时间限制:1秒 空间限制:32768K

解题思路

1、先判断模式串是否为空、再判断字符串是否为空。i表示字符串str的当前索引、j表示模式串pattern的当前索引

1、若剩余模式串pattern为空,则看剩余字符串str是否为空,同时为空返回true,否则返回false
2、若剩余模式串pattern不为空,先判断剩余字符串str是否为空

(1)剩余字符串str为空,则只有'a*'这种模式串能匹配(a为任意字符,也可以为'.')
(2)剩余字符串str不为空,那么判断剩余模式串是哪种形式
——1)若剩余模式串为1位或者不小于2位并且第2位不为'*'(可能是字母也可能是'.')
——2)若剩余模式串不小于2位并且第2位为'*',则判断第1位是否匹配

public class Solution {
    public boolean match(char[] str, char[] pattern)
    {
        return match(str, 0, pattern, 0);
    }
    public boolean match(char[] str, int i, char[] pattern, int j)
    {
        //1、若剩余的模式串为空,则看剩余字符串是否为空,同时为空返回true,否则返回false
        if(pattern.length==j) return str.length==i?true:false;
        //2、剩余模式串不为空,先判断剩余字符串是否为空
        //(1)剩余字符串为空,则只有'a*'这种模式串能匹配(a为任意字符,也可以为'.')
        if(str.length==i) return pattern.length==2+j&&pattern[j+1]=='*'?true:false;
        //(2)剩余字符串不为空,那么判断剩余模式串是哪种形式
        //    1)若剩余模式串为1位或者不小于2位并且第2位不为'*'(可能是字母也可能是'.')
        if((pattern.length>j+1&&pattern[j+1]!='*')||pattern.length==j+1){
            //此时剩余字符串已经确定不为空,因此字符串和模式串符合条件时其索引同时右移一位
            return str[i]==pattern[j]||pattern[j]=='.'?match(str,i+1,pattern,j+1):false;
        }
        else//2)若剩余模式串不小于2位并且第2位为'*',此时剩余字符串不为空
        {
            //若剩余模式串第1位能和剩余字符串第1位匹配,则剩余字符串右移1位继续匹配(匹配1+次)或模式串右移2位(匹配0次)
            if(str[i]==pattern[j]||pattern[j]=='.') return match(str,i+1,pattern,j)||match(str,i,pattern,j+2);
            else return match(str,i,pattern,j+2);//第1位不匹配,则模式串匹配0次
        }
    }
}

你可能感兴趣的:(正则表达式匹配)