朴素匹配可以换成KMP算法,这样的话,时间复杂度能达到线性
主要考虑是建立新的链表子串替换原链表中间的匹配项。不多说了,直接上代码
class
Node:
def__init__(self,element=None,next_=None,prev=None):
self._element=element
self._next=next_
self._prev=prev
class
StrList:
def__init__(self,string1):
self._head=None
self._rear=None
self._len=0
i=0
n=len(string1)
while i<n:
ifself._head
is None:
p=Node(string1[0])
self._head=p
self._rear=p
self._len+=1
else:
p=Node(string1[i])
p._prev=self._rear
self._rear._next=p
self._rear=p
self._len+=1
i +=1
defprintall(self):
p=self._head
while pis
notNone:
print(p._element)
p=p._next
defget_len(self):
returnself._len
defmatch(self,patternstr):
n=len(patternstr)
i,j=0,0
p=self._head
while i<nand
p is
notNone:
if patternstr[i]==p._element:
i+=1
j+=1
p=p._next
else:
j=j-i+1
while i>0:
p=p._prev
i-=1
p=p._next
i=0
if i==n:
return j-i
return-1
defreplace(self,patternstr,restr):
ifself.match(patternstr)==-1:
return"No match"
q=self._head
t=self._head
i=self.match(patternstr)
j=0
n=len(restr)
length=i+len(patternstr)
shead=None
srear=None
while i>0: #set
break point of first match point
t=t._next
i-=1
while length>0: #set
break point of second match point
q=q._next
length-=1
while j<n: #establish a new link
string independently
if sheadis
None:
shead=Node(restr[j])
srear=shead
else:
s=Node(restr[j])
s._prev=srear
srear._next=s
srear=s
j+=1
if t._previs
None: #attach new link string to two break points
self._head=shead
srear._next=q
q._prev=srear
elif qis
None:
self._rear=srear
t._prev._next=shead
shead._prev=t._prev
else:
t._prev._next=shead
shead._prev=t._prev
srear._next=q
q._prev=srear