19. 正则表达式匹配

NowCoder

题目描述

请实现一个函数用来匹配包括 ‘.’ 和 ‘‘ 的正则表达式。模式中的字符 ‘.’ 表示任意一个字符,而 ‘‘ 表示它前面的字符可以出现任意次(包含 0 次)。

在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串 “aaa” 与模式 “a.a” 和 “abaca” 匹配,但是与 “aa.a” 和 “ab*a” 均不匹配。

解题思路

应该注意到,’.’ 是用来当做一个任意字符,而 ‘‘ 是用来重复前面的字符。这两个的作用不同,不能把 ‘.’ 的作用和 ‘‘ 进行类比,从而把它当成重复前面字符一次。

  1. public boolean match(char[] str, char[] pattern) {
  2. int m = str.length, n = pattern.length;
  3. boolean[][] dp = new boolean[m + 1][n + 1];
  4. dp[0][0] = true;
  5. for (int i = 1; i <= n; i++)
  6. if (pattern[i - 1] == '*')
  7. dp[0][i] = dp[0][i - 2];
  8. for (int i = 1; i <= m; i++)
  9. for (int j = 1; j <= n; j++)
  10. if (str[i - 1] == pattern[j - 1] || pattern[j - 1] == '.')
  11. dp[i][j] = dp[i - 1][j - 1];
  12. else if (pattern[j - 1] == '*')
  13. if (pattern[j - 2] == str[i - 1] || pattern[j - 2] == '.') {
  14. dp[i][j] |= dp[i][j - 1]; // a* counts as single a
  15. dp[i][j] |= dp[i - 1][j]; // a* counts as multiple a
  16. dp[i][j] |= dp[i][j - 2]; // a* counts as empty
  17. } else
  18. dp[i][j] = dp[i][j - 2]; // a* only counts as empty
  19. return dp[m][n];
  20. }

19. 正则表达式匹配 - 图1