您的位置:首页 > 职场人生

剑指-面试题19 正则表达式匹配

2020-04-02 07:30 141 查看

正则表达式匹配

题目

思路:

递归求解:
(1)特殊情况,同时也是递归出口:如果p是空串,返回s是否为空串。如果p不为空,保证一定存在p[1](可能是字符串结尾\0)
(2)假如p[1] == “星号”的话,可以尝试两种情况:情况一是递归比较s和p.substr(2);情况二是当s[0]可以匹配p[0]时, 尝试递归比较s.substr(1)和p,这里没有必要比较s.substr(1) 和 p.substr(2),因为这种情况已经包含在递归比较s.substr(1)和p当中了。
(3)假如p[1] !=“星号”如果p[0]不匹配s[0],返回false,否则递归判断s.substr(1)和p.substr(1)。

C++

class Solution {
public:
bool isMatch(string s, string p) {
if (p.empty())
return s.empty();
if (p.size() > 1 && p[1] == '*')
{
return (isMatch(s, p.substr(2)) || (!s.empty()) && (s[0] == p[0] || p[0] == '.') && isMatch(s.substr(1), p));
}
return !s.empty() && (s[0] == p[0] || p[0] == '.') && isMatch(s.substr(1), p.substr(1));		//p的第二个值不是*,就递归判断s和p的下一个字符
}
};

python

class Solution:
def isMatch(self, s: str, p: str) -> bool:
if not p:
return not s
first_match = bool(s) and p[0] in [s[0], '.']
if len(p) >= 2 and p[1] == '*':
# 如果发现有字符和 '*' 结合,或者匹配该字符 0 次,然后跳过 该字符 和 '*'
# 或者当 p[0] 和 s[0] 匹配后,移动 s
return self.isMatch(s, p[2:]) or (first_match and self.isMatch(s[1:], p))
else:
return first_match and self.isMatch(s[1:], p[1:])
  • 点赞
  • 收藏
  • 分享
  • 文章举报
青山遇绝壁 发布了35 篇原创文章 · 获赞 0 · 访问量 664 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: