• 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;
        }
    }
    
  • 相关阅读:
    软件开发 —— 重构(refactor)
    语言与哲学 —— 维特根斯坦
    【撸码caffe 三】 caffe.cpp
    编程语言入门及进阶、设计模式、面向对象书籍
    用ISA2006配置单网卡缓存服务器
    Forefront TMG 之 ISP 冗余传输链路(ISP-R)
    MDT配置数据库
    MDT概念说明
    更改SQL实例端口
    SCCM2012安装、配置
  • 原文地址:https://www.cnblogs.com/yjxyy/p/10946886.html
Copyright © 2020-2023  润新知