剑指offer 面试题19: 正则表达式匹配(java)

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

思路:

1.模式中的第二个字符不是’*'

  判断字符串和模式中的第一个字符是否匹配

    1.如果不匹配,则返回false

    2.如果匹配,字符串和模式都后移一个字符,继续进行匹配

2.模式中的第二个字符是’*'

字符串和模式的第一个字符匹配

  1.字符串后移一位,模式后移两位(即跳过’’ 从’‘后面一个字符进行匹配)

  2.字符串后移一位,模式不移动(因为题上说’‘表示它前面的字符可以出现任意次(含0次),即’‘前面的字符可以匹配多位)

  3.字符串不动,模式后移两位(忽略掉’*'和其前面的那一个字符,从第三位开始进行匹配)

字符串和模式的第一个字符不匹配

  1.模式后移两位,继续进行匹配。

代码实现

public static void main(String[] args) {
        char[] str={'a','a','a'};
        char[] pattern={'a','.','a'};
        char[] pattern1={'a','b','*','a','c','*','a'};
        System.out.println(match(str,pattern));
        System.out.println(match(str,pattern1));
    }
    public static boolean match(char[] str,char[] pattern){
        if(str==null||pattern==null){
            return false;
        }
        int strIndex=0;
        int patternIndex=0;
        return matchCore(str,strIndex,pattern,patternIndex);
    }
    public static boolean matchCore(char[] str,int strIndex,char[] pattern,int patternIndex){

        //如果字符串和模式都已经遍历到末尾,那么匹配成功
        if(strIndex==str.length&&patternIndex==pattern.length){
            return true;
        }
        //如果模式遍历到了末尾,但是字符串还没遍历到末尾,匹配失败
        if(strIndex!=str.length&&patternIndex==pattern.length){
            return false;
        }
        //模式中的第二个字符是'*'
        if(patternIndex+1<pattern.length&&pattern[patternIndex+1]=='*'){
            if(strIndex!=str.length&&str[strIndex]==pattern[patternIndex]||(pattern[patternIndex]=='.'&&strIndex!=str.length)){
                return matchCore(str,strIndex+1,pattern,patternIndex+2)
                        ||matchCore(str,strIndex+1,pattern,patternIndex)
                        ||matchCore(str,strIndex,pattern,patternIndex+2);
            }else {
                return matchCore(str,strIndex,pattern,patternIndex+2);
            }
        }
        if(str[strIndex]==pattern[patternIndex]||(pattern[patternIndex]=='.'&&strIndex!=str.length)){
            return matchCore(str,strIndex+1,pattern,patternIndex+1);
        }
        return false;

你可能感兴趣的:(剑指offer)