LeeCode题库第十题
10.正则表达式匹配
项目场景:
给你一个字符串 s
和一个字符规律 p
,请你来实现一个支持 '.'
和 '*'
的正则表达式匹配。
'.'
匹配任意单个字符'*'
匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s
的,而不是部分字符串。
示例 1:
输入:s = "aa", p = "a" 输出:false 解释:"a" 无法匹配 "aa" 整个字符串。
示例 2:
输入:s = "aa", p = "a*" 输出:true 解释:因为 '*' 代表可以匹配零个或多个前面的那一个元素, 在这里前面的元素就是 'a'。因此,字符串 "aa" 可被视为 'a' 重复了一次。
示例 3:
输入:s = "ab", p = ".*" 输出:true 解释:".*" 表示可匹配零个或多个('*')任意字符('.')。
提示:
1 <= s.length <= 20
1 <= p.length <= 20
s
只包含从a-z
的小写字母。p
只包含从a-z
的小写字母,以及字符.
和*
。- 保证每次出现字符
*
时,前面都匹配到有效的字符
问题描述
dp[i][j]
表示 s
的前 i
个字符和 p
的前 j
个字符是否匹配。代码首先初始化 dp[0][0] = True
,表示空字符串和空模式匹配,然后处理模式 p
中 *
的情况,确保可以匹配空字符串。接着通过状态转移填充动态规划表:如果 p[j-1]
是 *
,则考虑忽略 *
及其前面的字符,或者匹配 s[i-1]
与 *
前面的字符;如果 p[j-1]
不是 *
,则直接匹配 s[i-1]
和 p[j-1]
或 .
。最终,dp[-1][-1]
表示整个字符串 s
和模式 p
是否匹配。
class Solution:
def isMatch(self, s: str, p: str) -> bool:
m,n=len(s)+1,len(p)+1
dp=[[False]*n for _ in range(m)]
dp[0][0]=True
for j in range(2,n,2):
dp[0][j]=dp[0][j-2] and p[j-1]=='*'
for i in range(1,m):
for j in range(1,n):
if p[j-1]=='*':
if dp[i][j-2]:dp[i][j]=True
elif dp[i-1][j] and s[i-1]==p[j-2]:dp[i][j]=True
elif dp[i-1][j] and p[j-2]=='.':dp[i][j]=True
else:
if dp[i-1][j-1] and s[i-1]==p[j-1] :dp[i][j]=True
elif dp[i-1][j-1] and p[j-1]=='.':dp[i][j]=True
return dp[-1][-1]
本题提交情况。
以上为本篇文章的全部内容,感谢你抽出宝贵的时间阅读这篇文章。如果你有任何疑问或建议,欢迎在评论区留言,我们一起交流进步。愿你的代码之路越走越顺,生活充满阳光!