请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配;
这是剑指offer的一道原题,为了解决该问题,可以将字符串和模式串的匹配情况,分为以下三种情况;
-
模式为单个'.'或者单个普通字母时: 直接判断。
-
模式为普通字母和'*'的组合时,就是说普通字母后面跟着一个匹配符'*',例如 'A','*': 从这一位到与这一位的字符相等的位的下一位,逐次递归。
-
模式为'.'和'*'的组合时,就是说'.'后面跟着一个匹配符'*',也就是'.','*'这种情况: 从这一位到最后一位,逐次递归。
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 }