1. 正则表达式
这个题目复杂的原因之一,我觉得就是,即使不让你来实现,就是理解正则表达式,也不是那么容易,各种情况太多了,比如 “两个*连着”的情况合法不?题目里也没说,得自己去搜一些资料。
1.1 别人的解答
官网题解中有个不愿意透露姓名的大神写的,5行代码搞定。
class Solution:
def isMatch(self, s: str, p: str) -> bool:
if not p: return not s # 结束条件:p为空,此时如果s为空,则true,否则为false
first_match = (len(s) > 0) and p[0] in {s[0], '.'} # 两个字符串,最开始的部分是否匹配
# p的第二个字符为 “*” ,暗含第一个不能为 “*”
if len(p) >=2 and p[1] == '*':
# 匹配0个 | 多个
return self.isMatch(s, p[2:]) or (first_match and self.isMatch(s[1:], p))
## p的第二个字符不是 “*”
# 处理 `.` ,匹配一个
return first_match and self.isMatch(s[1:], p[1:])
作者:dz-lee
链接:https://leetcode-cn.com/problems/regular-expression-matching/solution/jian-ming-qing-xi-xie-fa-python3xiang-xi-zhu-shi-b/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1.2 自己的解答
我都忘了是我自己写出来的(我印象中就是把各种情况挨个都考虑到,没有别的高级操作)还是从哪里抄的,不论是哪一种,我自己也不想看,LeetCode超过30行的答案就感觉一个字——不想看!
class Solution:
def isMatch(self, s: str, p: str) -> bool:
def f_1(a_,b_):
a_=""
if len(b_)==1:
return(False)
else:
for i in range(len(b_)):
if b_[i]!='*':
if i+1<len(b_):
if b_[i+1]!='*':
return(False)
else:
return(False)
return(True)
if s=="" and p=="":
return(True)
elif s!="" and p=="":
return(False)
elif s=="" and p!="":
return(f_1("",p))
else:
l_s=len(s)+1
l_p=len(p)+1
matrix=[]
for i in range(l_s):
temp_list=[]
for j in range(l_p):
temp_list.append(False)
matrix.append(temp_list)
#matrix=[[False]*l_p]*l_s
matrix[0][0]=True
for j in range(1,l_p):
matrix[0][j]=f_1("",p[:j])
for i in range(1,l_s):
s_i=s[:i]
for j in range(1,l_p):
p_j=p[:j]
if p_j[-1]=="*":
if p_j[-2]==s_i[-1]:
if matrix[i][j-1] or matrix[i][j-2]:
matrix[i][j]=True
continue
temp_i=i-1
while temp_i>=0 and s_i[temp_i-1]==s_i[i-1]:
if matrix[temp_i][j-1] or matrix[temp_i][j-2]:
matrix[i][j]=True
break
temp_i=temp_i-1
if temp_i>=0 and s_i[temp_i]!=s_i[i-1]:
matrix[i][j]=matrix[temp_i][j-1] or matrix[temp_i][j-2]
elif p_j[-2]=='.':
for k in range(i,-1,-1):
if matrix[k][j-1] or matrix[k][j-2]:
matrix[i][j]=True
break
else:
matrix[i][j]=matrix[i][j-2]
elif p_j[-1]=='.' or p_j[-1]==s_i[-1]:
matrix[i][j]=matrix[i-1][j-1]
else:
pass
return(matrix[-1][-1])