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

数据范围

输入字符串长度 [0,300][0,300]。

样例

输入: s=”aa” p=”a*” 输出:true
image.png


  1. class Solution {
  2. public:
  3. // f[i, j] 表示s[1, 2, ...i] 与 p[1, 2, ...j]匹配的方案集合
  4. // 属性 集合是否为空
  5. bool isMatch(string s, string p) {
  6. int n = s.size(), m = p.size();
  7. s = ' ' + s, p = ' ' + p;
  8. vector<vector<bool>>f(n + 1, vector<bool>(m + 1));
  9. f[0][0] = true;
  10. // s可以为空串,p不能为空串
  11. for (int i = 0; i <= n; ++i) {
  12. for (int j = 1; j <= m; ++j) {
  13. if (j + 1 < p.size() && p[j + 1] == '*') continue;
  14. if (i && p[j] != '*') {
  15. f[i][j] = f[i - 1][j - 1] && (s[i] == p[j] || p[j] == '.');
  16. }
  17. else if (p[j] == '*') {
  18. f[i][j] = f[i][j - 2] || i && f[i - 1][j] && (s[i] == p[j - 1] || p[j - 1] == '.');
  19. }
  20. }
  21. }
  22. return f[n][m];
  23. }
  24. };