54.正则表达式匹配

题目描述:

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

思路分析:

  首先判断模式的第二个字符是不是*。

  如果不是,则判断字符串的第一个字符和模式的第一个字符是否匹配,如果不匹配则返回false,否则向下继续比较。如果字符串遍历到最后,模式也遍历到最后,那么证明匹配,如果模式遍历到了最后,而字符串没有遍历到最后,则不匹配。

  如果是,则分两种情况 ,判断字符串的第一个字符和模式第一个字符是否匹配,如果匹配则可以有以下三种匹配方式:

  (1)模式后移两位,相当于x*被忽略(aaa a * aaa)

  (2)字符串后移一位,模式后移两位(abc a * bc)

  (3)字符串后移一位,模式不变(aaa a*)

  如果不匹配,字符串不变,模式后移两位。

代码:

public class Solution {
    public boolean match(char[] str, char[] pattern)
    {
        if(str==null||pattern ==null)
            return false;
        if(str.length==0&&pattern.length==0)
            return true;
        return isMatch(str,pattern,0,0);
    }
    public boolean isMatch(char[]str,char[]pattern,int strIndex,int patternIndex){
        if(strIndex==str.length&&patternIndex==pattern.length)
            return true;                  //匹配
        if(patternIndex==pattern.length&&strIndex!=str.length)
            return false;                //不匹配
        if(patternIndex+1<pattern.length&&pattern[patternIndex+1]=='*'){  //模式的第二个字符为‘*’
            if(strIndex<str.length&&str[strIndex]==pattern[patternIndex]||strIndex<str.length&&pattern[patternIndex]=='.'){//字符串第一个元素和模式中的第一个元素匹配
                return isMatch(str,pattern,strIndex,patternIndex+2)||          //aaa a*aaa
                    isMatch(str,pattern,strIndex+1,patternIndex+2)||             //abc    a*bc
                    isMatch(str,pattern,strIndex+1,patternIndex);                 //aaa     a*
            }else{        //字符串的第一个元素和模式中的第一个元素不等
                return isMatch(str,pattern,strIndex,patternIndex+2); // abc  c*abc
            }
        }
        if(strIndex!=str.length&&pattern[patternIndex]==str[strIndex]||strIndex!=str.length&&pattern[patternIndex]=='.'){ //第二个字符不为*
            return isMatch(str,pattern,strIndex+1,patternIndex+1);
        }
        return false;
    }
}
posted @ 2019-05-29 22:56  yjxyy  阅读(137)  评论(0编辑  收藏  举报