模式匹配算法-Java實現


請實現一個函數用來匹配包括'.'和'*'的正則表達式。模式中的字符'.'表示任意一個字符,而'*'表示它前面的字符可以出現任意次(包含0次)。 在本題中,匹配是指字符串的所有字符匹配整個模式。例如,字符串"aaa"與模式"a.a"和"ab*ac*a"匹配,但是與"aa.a"和"ab*a"均不匹配;

這是劍指offer的一道原題,為了解決該問題,可以將字符串和模式串的匹配情況,分為以下三種情況;

  1. 模式為單個'.'或者單個普通字母時: 直接判斷。

  2. 模式為普通字母和'*'的組合時,就是說普通字母后面跟着一個匹配符'*',例如 'A','*': 從這一位到與這一位的字符相等的位的下一位,逐次遞歸。

  3. 模式為'.'和'*'的組合時,就是說'.'后面跟着一個匹配符'*',也就是'.','*'這種情況: 從這一位到最后一位,逐次遞歸。

 

 1 /**
 2  * Created by hardaway on 2018/7/25.
 3  */
 4 public class Code16 {
 5 
 6     public boolean match(char[] str, char[] pattern){
 7         if(str.length==0){
 8             return check(0,pattern);
 9         }
10         return match(str,pattern,0,0);
11     }
12     public boolean match(char[] str, char[] pattern, int is, int js){
13         int j = js;
14         int i = is;
15         for( ; i<str.length&&j<pattern.length; ){
16             //  模式為 .* 時:
17             if((j<pattern.length-1)&&(pattern[j+1]=='*')){
18                 if(pattern[j]=='.'){
19                     if(j+2==pattern.length)
20                         return true;
21                     boolean flag = false;
22                     for(int ii = i; ii<str.length; ii++){
23                         if(str[ii]==pattern[j+2]){
24                             flag = match(str,pattern,ii,j+2);
25                             if(flag) break;
26                         }
27                     }
28                     return flag;
29              // 模式為 普通字母* 時: eg. A*
30                 }else{
31                     if(str[i] == pattern[j]){
32                         int str_len = getLength(i,str,str[i]);
33                         if(j+2==pattern.length){
34                             if(i+str_len==str.length)
35                                 return true;
36                         }
37                         boolean flag = false;
38                         int right = i+str_len;
39                         for(int ii = i; ii<str.length&&ii<=right; ii++){
40                             flag = match(str,pattern,ii,j+2);
41                             if(flag) break;
42                         }
43                         return flag;
44                     }else {
45                         i = i;
46                         j = j + 2;
47                     }
48                 }
49              // 模式為單個 . 或者單個普通字母時:
50             }else{
51                 if(str[i]==pattern[j]||pattern[j]=='.'){
52                     i++; j++;
53                 }else{
54                     return false;
55                 }
56             }
57         }
58         if(i==str.length)
59             return check(j,pattern);
60         return false;
61     }
62     public boolean check(int sta , char[] arr){
63         boolean flag = false;
64         if ((arr.length-sta)%2==0){
65             int i = sta+1;
66             while (i<arr.length&&arr[i]=='*'){
67                 i=i+2;
68             }
69             if(i==arr.length+1)
70                 flag = true;
71         }
72         return flag;
73     }
74     public int getLength(int i, char[] arr,char obj){
75         int len = 0;
76         while(i<arr.length&&arr[i]==obj){
77             i++;
78             len++;
79         }
80         return len;
81     }
82     public static void main(String[] args) {
83         Code16 c =new Code16();
84         char[] str =  {};//{'a','b','c','d','a','b','b','b','b','b','b','d'};
85         char[] pattern ={'.','*'};// {'a','b','c','.','a','.','*','b','d'};
86         System.out.println(c.match(str,pattern));
87     }
88 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM