Skip to the content.

Ex19 正则表达式匹配

题目描述

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

解题思路

本题最重要的是对*的妥善处理。

除*外,字符匹配成功的情况还包括p[0] = '.'时(s[0]为任意)所以,当字符成功匹配时,第二个字符是*,存在着三种情况:

当字符匹配不成功且第二个字符为*时,唯一的情况是把*当作0次匹配。

代码

bool
isMatch (char *s, char *p)
{
  if (!s || !p)
    return false;
  if (s[0] == '\0' && p[0] == '\0')
    return true;
  if (s[0] != '\0' && p[0] == '\0')
    return false;
  if (p[1] == '*')
    {
      if (p[0] == s[0] || (p[0] == '.' && s[0] != '\0'))
        return isMatch (s + 1, p + 2) || isMatch (s + 1, p)
               || isMatch (s, p + 2);
      return isMatch (s, p + 2);
    }
  else if (s[0] == p[0] || (p[0] == '.' && s[0] != '\0'))
    return isMatch (s + 1, p + 1);
  return false;
}

结果

执行结果:通过

执行用时:1020 ms, 在所有 C 提交中击败了13.97%的用户

内存消耗:5.4 MB, 在所有 C 提交中击败了17.16%的用户