正则表达式匹配
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 }