如果你想在校招中顺利拿到更好的offer,阿秀建议你多看看前人的经验 ,比如准备简历实习上岸经历校招总结阿里、字节、腾讯、美团等一二线大厂真实面经也欢迎来一起参加秋招打卡活动 等;如果你是计算机小白,学习/转行/校招路上感到迷茫或者需要帮助,可以点此联系阿秀;免费分享阿秀个人学习计算机以来的收集到的好资源,点此白嫖;如果你需要《阿秀的学习笔记》网站中求职相关知识点的PDF版本的话,可以点此下载

# 剑指 Offer 19. 正则表达式匹配

力扣原题链接(点我直达) (opens new window)

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

示例 1:

输入:
s = "aa"
p = "a"
输出: false
解释: "a" 无法匹配 "aa" 整个字符串。
1
2
3
4
5

示例 2:

输入:
s = "aa"
p = "a*"
输出: true
解释: 因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。
1
2
3
4
5

示例 3:

输入:
s = "ab"
p = ".*"
输出: true
解释: ".*" 表示可匹配零个或多个('*')任意字符('.')。
1
2
3
4
5

示例 4:

输入:
s = "aab"
p = "c*a*b"
输出: true
解释: 因为 '*' 表示零个或多个,这里 'c' 为 0 个, 'a' 被重复一次。因此可以匹配字符串 "aab"。
1
2
3
4
5

示例 5:

输入:
s = "mississippi"
p = "mis*is*p*."
输出: false
1
2
3
4
  • s 可能为空,且只包含从 a-z 的小写字母。
  • p 可能为空,且只包含从 a-z 的小写字母以及字符 .*,无连续的 '*'

# 1、牛课上大佬写法

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

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

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

}

bool isMatch(string s, string p) {
	
	return isMatchCore(s.c_str(), p.c_str());
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20