剑指offer 51:正则表达式匹配

题目描述

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

在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配

思路:

  1. 首先要理解正则表达式两个字符.和*,.是可以匹配任意一个字符,而*则是前一个字符可以出现0-n次
  2. 情况有很多种,我们这里考虑模式串也就是pattern,①空②.③④.⑤a和aa*是一样的,与字符串比较
  3. 考虑很多种情况,建议带入代码详细阅读
public class Solution {
  public boolean match(char[] str, char[] pattern)
    {
        return matchTwo(str,0,str.length,pattern,0,pattern.length);
         
    }
private boolean matchTwo(char[] str, int i, int length1, char[] pattern,
            int j, int length2) {
        if(i==length1&&j==length2) {   //因为传进来是0,如果相等就直接返回true
            return true;
        }
       //a*a*
      //如果字符串为0,但是模式串不为0
        if(i==length1&&j!=length2) { 
            while(j!=length2){
                //第一个不是*,如果模式串长度为1那肯定不等,或者第一个不是*,第二个也不是*也不等
                if(pattern[j]!='*'&&(j+1>=length2||pattern[j+1]!='*')){    //偶数位是否为*
                    return false;             //a*a*
                }
                //如果第二个是*了,接下来继续判断后面,第二个*为第一个直接j++;j=2
                j++;
            }
            return true;
        }
        //2. 如果模式串为空,字符串不为空直接false
        if(i!=length1&&j==length2) {
            return false;
        }
        //如果模式长度为1,如果模式串和字符串相等或者模式串那一个是.就比较下一个,长度都相等的话递归会返回true
        if(j+1==length2){
            if(str[i]==pattern[j]||pattern[j]=='.')
                return matchTwo(str, i+1, length1, pattern, j+1, length2);
            else {
                return false;
            }
        }
        if((str[i]==pattern[j]||pattern[j]=='.')&&pattern[j+1]!='*')    //如果下一个不是*,递归直接比较每个字符,只用注意.
            return matchTwo(str, i+1, length1, pattern, j+1, length2);
        if((str[i]==pattern[j]||pattern[j]=='.')&&pattern[j+1]=='*')
            //如果下一个是*,那模式串为.和*,当*为出现0次直接开始比较模式串的后面2位
            //另一种情况继续比较字符串第二个因为模式串有*可以出现多个.
            return matchTwo(str, i, length1, pattern, j+2, length2)||matchTwo(str, i+1, length1, pattern, j, length2);
        if(pattern[j+1]=='*')//如果第一个不相等也不为.但是第二个为*,仍然可以匹配,因为*可以出现0次
            return matchTwo(str, i, length1, pattern, j+2, length2);
        return false;
    }
}
发布了105 篇原创文章 · 获赞 19 · 访问量 4967

猜你喜欢

转载自blog.csdn.net/jiohfgj/article/details/105041860