当前位置:  首页>> 技术小册>> 数据结构与算法(下)

题目描述

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

解法

判断模式中第二个字符是否是 *

  • 若是,看如果模式串第一个字符与字符串第一个字符是否匹配:
      1. 若不匹配,在模式串上向右移动两个字符j+2,相当于 a* 被忽略
      1. 若匹配,字符串后移i+1。此时模式串可以移动两个字符j+2,也可以不移动j
  • 若不是,看当前字符与模式串的当前字符是否匹配,即 str[i] == pattern[j] || pattern[j] == ‘.’:
      1. 若匹配,则字符串与模式串都向右移动一位,i+1j+1
      1. 若不匹配,返回 fasle。
  1. /**
  2. * @author bingo
  3. * @since 2018/11/21
  4. */
  5. public class Solution {
  6. /**
  7. * 判断字符串是否与模式串匹配
  8. * @param str 字符串
  9. * @param pattern 模式串
  10. * @return 是否匹配
  11. */
  12. public boolean match(char[] str, char[] pattern) {
  13. if (str == null || pattern == null) {
  14. return false;
  15. }
  16. return match(str, 0, str.length, pattern, 0, pattern.length);
  17. }
  18. private boolean match(char[] str, int i, int len1,
  19. char[] pattern, int j, int len2) {
  20. if (i == len1 && j == len2) {
  21. return true;
  22. }
  23. // "",".*"
  24. if (i != len1 && j == len2) {
  25. return false;
  26. }
  27. if (j + 1 < len2 && pattern[j + 1] == '*') {
  28. if (i < len1 && (str[i] == pattern[j] || pattern[j] == '.')) {
  29. return match(str, i, len1, pattern, j + 2, len2)
  30. || match(str, i + 1, len1, pattern, j, len2)
  31. || match(str, i + 1, len1, pattern,j + 2, len2);
  32. }
  33. // "",".*"
  34. return match(str, i, len1, pattern, j + 2, len2);
  35. }
  36. if (i < len1 && (str[i] == pattern[j] || pattern[j] == '.')) {
  37. return match(str, i + 1, len1, pattern, j + 1, len2);
  38. }
  39. return false;
  40. }
  41. }

测试用例

  1. 功能测试(模式字符串里包含普通字符、.*;模式字符串和输入字符串匹配/不匹配);
  2. 特殊输入测试(输入字符串和模式字符串是空指针、空字符串)。

该分类下的相关小册推荐: