剑指offer系列26--正则表达式匹配

Posted noaman_wgs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指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 }

 

以上是关于剑指offer系列26--正则表达式匹配的主要内容,如果未能解决你的问题,请参考以下文章

剑指 Offer 19. 正则表达式匹配 的详细题解

剑指OFFER 正则表达式匹配

《剑指offer》 面试题53 :正则表达式匹配 Java

LeetCode(剑指 Offer)- 19. 正则表达式匹配

剑指Offer52:正则表达式匹配(Java)

剑指offer-正则表达式匹配