• 剑指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 }
  • 相关阅读:
    java中子类与父类中隐含的this引用的分析
    c++中基类与派生类中隐含的this指针的分析
    c++中关于初始化型参列表的一些问题
    2014牡丹江网络zoj3816Generalized Palindromic Number(dfs或者bfs)
    2014牡丹江网络赛ZOJPretty Poem(暴力枚举)
    poj1949Chores(建图或者dp)
    poj 1950 Dessert(dfs枚举,模拟运算过程)
    java中自动装箱的问题
    hdu4292Food(最大流Dinic算法)
    codeforces Gargari and Permutations(DAG+BFS)
  • 原文地址:https://www.cnblogs.com/noaman/p/5543544.html
Copyright © 2020-2023  润新知