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

本文探讨了如何使用Python实现链表中子串的朴素匹配,并提出可以优化为KMP算法以达到线性时间复杂度。文章重点在于展示如何在链表中替换匹配到的子串,通过代码进行详细说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 朴素匹配可以换成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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值