zoukankan      html  css  js  c++  java
  • 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;
        }
    }
    
  • 相关阅读:
    数据库性能优化之冗余字段的作用
    SQL里面的排序语句desc和ASC有什么区别
    Mybatis@options注解属性useGeneratedKeys,keyProperty,keyColumn的使用
    关于resultType与parameterType的基本使用和区别
    阿里云Centos7的部署springboot后mysql中文问号乱码
    LINUX下启动/停止/重启MYSQL
    CondenseNet:可学习分组卷积,原作对DenseNet的轻量化改造 | CVPR 2018
    MnasNet:经典轻量级神经网络搜索方法 | CVPR 2019
    MobileNetV1/V2/V3简述 | 轻量级网络
    ShuffleNetV1/V2简述 | 轻量级网络
  • 原文地址:https://www.cnblogs.com/yjxyy/p/10946886.html
Copyright © 2011-2022 走看看