1 package algorithms;
2
3 /**
4 * 请实现一个函数用来匹配包括'.'和'*'的正则表达式。 模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。
5 * 在本题中,匹配是指字符串的所有字符匹配整个模式。 例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配
6 *
7 *
8 **/
9
10 public class StringMatch {
11 public boolean match(char[] str, char[] pattern) {
12 return matchCore(str, 0, pattern, 0);
13 }
14
15 public boolean matchCore(char[] str, int i, char[] pattern, int j) {
16 if (i >= str.length && j >= pattern.length) {
17 return true;
18 }
19 if (i != str.length - 1 && j == pattern.length - 1)
20 return false;
21 // 一种较为复杂的情况 即模式的字符后面一个字符为*
22 if (j < pattern.length - 1 && pattern[j + 1] == '*') {
23 // 如果两者当前能够匹配上 模式有两种选择
24 // 一是向后移动两个字符 二是原地不动
25 // 如果当成匹配上字符串也需要向后移动一个字符
26 if (i < str.length && (pattern[j] == str[i] || (pattern[j] == '.' && i < str.length))) {
27 return matchCore(str, i + 1, pattern, j + 2) || matchCore(str, i + 1, pattern, j)
28 || matchCore(str, i, pattern, j + 2);
29 } else
30 return matchCore(str, i, pattern, j + 2);
31
32 }
33 // 如果模式的字符后一个不是*时,该情况较为简单 直接比较即可
34 if (i < str.length && j < pattern.length && (str[i] == pattern[j] || (pattern[j] == '.' && i < str.length)))
35 return matchCore(str, i + 1, pattern, j + 1);
36 return false;
37 }
38
39 public static void main(String[] args) {
40 char[] str = { 'a', 'a' };
41 char[] pattern = { 'a', '*' };
42 StringMatch ma = new StringMatch();
43 System.out.println(ma.match(str, pattern));
44 }
45 }