zoukankan      html  css  js  c++  java
  • 剑指offer系列26--正则表达式匹配

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

     1 package com.exe6.offer;
     2 /**
     3  * 【题目】请实现一个函数用来匹配包括’.’和’*‘的正则表达式。模式中的字符’.’表示任意一个字符,
     4  *         而’‘表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。
     5  *         例如,字符串”aaa”与模式”a.a”和”abaca”匹配,但是与”aa.a”和”aba”均不匹配
     6  * @author WGS
     7  *
     8  */
     9 public class MatchRegString {
    10 
    11     public boolean match(char[] str,char[] pattern){
    12         if(str==null ||pattern==null)
    13             return false;
    14         return matchCore(str,0,str.length,pattern,0,pattern.length);
    15     }
    16     
    17     public boolean matchCore(char[] str, int i, int length1, char[] pattern, int j, int length2) {
    18         if(i==length1 && j==length2){
    19             return true;
    20             /*if(j==length2 || pattern[j]=='*'){
    21                 return true;
    22             }else{
    23                 return false;
    24             }*/
    25         }
    26         if(i!=length1 && j==length2){
    27             return false;
    28         }
    29         //3 当pattern中下一个字符有'*'时
    30         if(j+1<length2 && pattern[j+1]=='*'){
    31             //① a A a与a A * a  即*前值与str中要比较的值相同 
    32             //   a A a与a . * a
    33             if(str[i]==pattern[j]){
    34                 //后移两位
    35                 return matchCore(str,i+1,length1,pattern,j+2,length2)
    36                 //在原状态
    37                 ||     matchCore(str,i+1,length1,pattern,j,length2)
    38                 //忽略
    39                 ||     matchCore(str,i+1,length1,pattern,j+2,length2);
    40             }
    41             //②a A a与a B * a  即*前值与str中要比较的值不同 pattern就忽略*前的值,后移两位继续比较,str 值不变
    42             else{
    43                 return matchCore(str,i,length1,pattern,j+2,length2);
    44             }
    45         }
    46         
    47         //1 2 当前字符匹配或者匹配'.' 两者均右移一位继续比较;
    48         if(i<length1 && (str[i]==pattern[j] || pattern[j]=='.')){
    49             return matchCore(str,i+1,length1,pattern,j+1,length2);
    50         }
    51         return false;
    52     }
    53 
    54     public static void main(String[] args) {
    55         char[] str=new char[]{'a', 'a', 'a'};
    56         char[] pattern=new char[]{'a', 'b','*','a', 'c','*','a'};
    57         MatchRegString m=new MatchRegString();
    58         boolean b=m.match(str, pattern);
    59         System.out.println(b);
    60 
    61     }
    62 
    63 }
  • 相关阅读:
    cookie与session的区别
    基于TCP协议的网络编程
    springboot第一篇:springboot基础
    java中的正则表达式
    NIO
    io基础(字节流、字符流、转换流、缓冲字符流)
    基于UDP协议的网络编程
    es6.3学习笔记
    线程同步和线程通信
    java字符串各种编码
  • 原文地址:https://www.cnblogs.com/noaman/p/5543544.html
Copyright © 2011-2022 走看看