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

Python链表与子串元素朴素匹配和链表元素替换

2018-01-13 17:06 246 查看
 朴素匹配可以换成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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 数据结构