一、题目

请实现一个函数用来匹配包含 . 和 的正则表达式。模式中的字符’.’表示任意一个字符,而 表示它前面的字符可以出现任意次(含0次)。本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串“aaa”与模式“a.a”和“abaca”匹配,但与“aa.a”及“ab*a”均不匹配。

二、解题思路

假设字符串为str,模式串为pattern,考虑以下情况:

A. 模式串下一个字符为 * :

如果当前字符匹配,三种可能:

1、模式串当前字符出现0次,即 * 表示当前字符出现0次,则str[i]->str[i],pattern[j]->pattern[j+2];

2、模式串当前字符出现1次,即 * 表示当前字符出现1次,则str[i]->str[i+1],pattern[j]->pattern[j+2];

3、模式串当前字符出现2次或2次以上,即 * 表示当前字符出现2次或以上,则str[i]->str[i+1],pattern[j]->pattern[i];

如果当前字符不匹配,则只能让 * 表示当前字符出现0次,则str[i]->str[i],pattern[j]->pattern[j+2];

B. 模式串下一个字符不为 *

如果当前字符匹配,则str=str+1,pattern=pattern+1.

三、解题代码

  1. public class Test {
  2. /**
  3. * 题目:请实现一个函数用来匹配包含‘.’和‘*’的正则表达式。模式中的字符'.'表示任意一个字符,
  4. * 而‘*’表示它前面的字符可以出现任意次(含0次)。本题中,匹配是指字符串的所有字符匹配整个模式。
  5. *
  6. * @param input
  7. * @param pattern
  8. * @return
  9. */
  10. public static boolean match(String input, String pattern) {
  11. if (input == null || pattern == null) {
  12. return false;
  13. }
  14. return matchCore(input, 0, pattern, 0);
  15. }
  16. private static boolean matchCore(String input, int i, String pattern, int p) {
  17. // 匹配串和模式串都到达尾,说明成功匹配
  18. if (i >= input.length() && p >= pattern.length()) {
  19. return true;
  20. }
  21. // 只有模式串到达结尾,说明匹配失败
  22. if (i != input.length() && p >= pattern.length()) {
  23. return false;
  24. }
  25. // 模式串未结束,匹配串有可能结束有可能未结束
  26. // p位置的下一个字符中为*号
  27. if (p + 1 < pattern.length() && pattern.charAt(p + 1) == '*') {
  28. // 匹配串已经结束
  29. if (i >= input.length()) {
  30. return matchCore(input, i, pattern, p + 2);
  31. }
  32. // 匹配串还没有结束
  33. else {
  34. if (pattern.charAt(p) == input.charAt(i) || pattern.charAt(p) == '.') {
  35. return
  36. // 匹配串向后移动一个位置,模式串向后移动两个位置
  37. matchCore(input, i + 1, pattern, p + 2)
  38. // 匹配串向后移动一个位置,模式串不移动
  39. || matchCore(input, i + 1, pattern, p)
  40. // 匹配串不移动,模式串向后移动两个位置
  41. || matchCore(input, i, pattern, p + 2);
  42. } else {
  43. return matchCore(input, i, pattern, p + 2);
  44. }
  45. }
  46. }
  47. // 匹配串已经结束
  48. if (i >= input.length()) {
  49. return false;
  50. }
  51. // 匹配串还没有结束
  52. else {
  53. if (input.charAt(i) == pattern.charAt(p) || pattern.charAt(p) == '.') {
  54. return matchCore(input, i + 1, pattern, p + 1);
  55. }
  56. }
  57. return false;
  58. }
  59. }