字符串匹配算法

作者: 凌霄文强 | 来源:发表于2019-03-08 21:12 被阅读0次

    字符串匹配问题指的是从一个大字符串S中寻找是否包含小的串s,如果包含找到起始位置。或者说从主串中寻找模式串。
    在牛客网上有该题:(串的模式匹配)
    题目描述
    对于两个字符串A,B。请设计一个高效算法,找到B在A中第一次出现的起始位置。若B未在A中出现,则返回-1。
    给定两个字符串A和B,及它们的长度lena和lenb,请返回题目所求的答案。
    测试样例
    "acbc",4,"bc",2
    返回:2

    朴素的字符串匹配算法

    朴素的字符串匹配算法也就是能直接想到的算法,将大字符串的每一个字符和小字符串做匹配,类似于小字符串是一个滑动窗口,每次滑动1,看是否相等。

    class StringPattern:
        def findAppearance(self, A, lena, B, lenb):
            # write code here
            for i in range(lena-lenb+1):
                flag=0
                for j in range(lenb):
                    if A[i+j]!=B[j]:
                        flag=1
                        break
                if flag==0:
                    return i
            return -1
    

    时间复杂度是O(m*n)


    KMP

    通过设定一个next数组,当匹配失败时可以跳转到一定的位置继续比较。

    class StringPattern:
       def getNext(self, A, lena):
           i=0
           j=-1
           next=[-1]
           while i<lena:
               if j==-1 or A[i]==A[j]:
                   i+=1
                   j+=1
                   next.append(j)
               else:
                   j=next[j]
           return next
       
       def findAppearance(self, A, lena, B, lenb):
           # write code here
           next=self.getNext(B,lenb)
           i=0
           j=0
           while i<lena and j<lenb:
               if j==-1 or A[i]==B[j]:
                   if j==lenb-1:
                       return i-lenb+1
                   i+=1
                   j+=1
               else:
                   j=next[j]
           return -1
    

    相关文章

      网友评论

        本文标题:字符串匹配算法

        本文链接:https://www.haomeiwen.com/subject/ciedpqtx.html