• 一、题目
  • 二、解题思路
  • 三、解题代码

    一、题目

    请实现一个函数用来匹配包含 . 和 的正则表达式。模式中的字符’.’表示任意一个字符,而 表示它前面的字符可以出现任意次(含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. }