您的位置:首页 > 编程语言 > Python开发

python学习日志7

2016-12-13 10:02 393 查看
leetcode之wildcard matching解法

这个是通配符的匹配与实现,只用到*,?两个字符

第一次思考之这个问题,用到了函数递归方法,即先将判断出*的字符串截取,继续调用isMatch()这个函数

class WildcardMatching(object):
def isMatch(self,s,p):
i=0
j=0
t=0
if len(s)<self.reallen(p):
return False
while i<len(s):
#这里只判断?号
if j<len(p) and (p[j]==s[i] or p[j]=='?'):
j+=1
i+=1
continue
#这里判断*号
elif j<len(p) and p[j]=='*':
while j<len(p):
if p[j]=='*':
j+=1
else:
break
if j==len(p):
return True
else:
t=len(s)-self.reallen(p[j:])
while i<=t:
if p[j]==s[i] or p[j]=='?':
if self.isMatch(s[i:],p[j:]):
return True
i+=1
if i==t+1:
return False
else:
return False
return True
def reallen(self,l):
return len(l)-l.count('*')


但是最后超时了,python函数调用虽然方便,但是底层的实现还是用C语言,对于字符串的操作如果是截取,还是很浪费时间的,另外递归也可以用循环来代替,所以把上面的代码整合成下面的代码了,但是总体的思路是一样的,所以以后写代码,还是要注意质量

class WildcardMatch(object):
def isMatch(self,s,p):
i=0
j=0
m=0
n=0
if len(s)<len(p)-p.count('*'):
return False
while i!=len(s):
if j<len(p) and (p[j]=='?' or p[j]==s[i]):
i+=1
j+=1
continue
if j<len(p) and p[j]=='*':
n=j
j+=1
m=i
continue
if n<len(p) and p
=='*':
j=n+1
i=m+1
m+=1
continue
return False
while j<len(p) and p[j]=='*':
j+=1
return j==len(p)

这里学习python已经一个月了,自己还是个小白,希望大神多多指点


更多leetcode解题源码,请查看我的github地址https://github.com/Jum1023/leetcode

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息